美文网首页
命名空间

命名空间

作者: 帝都宁 | 来源:发表于2017-03-01 21:22 被阅读25次

    PHP的命名空间是在5.3.0时引入的,用来按照虚拟目录结构组织PHP的代码。

    为什么使用命名空间

    总结:为了避免命名空间冲突的问题!

    作为开发者,除非你开发的是一个小项目,几乎不使用其他第三方的依赖,并且你的代码也不会被其他人使用,不然都可能会遇到命名冲突的问题:不管是类名、借口、函数和常量。
    所以使用自己的命名空间,将自己的代码放到唯一的空间之内,这样其他人定义了同样的类名等,但由于声明在不同的空间之内,可以进行有效的区分,完全不会造成冲突,进而引发各种错误。
    在PHP引入命名空间之前,因为Zend框架而流行的命名方式:Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query。这样的类名,使用_下划线来作为目录的分隔符,这样可以保证类名的唯一,并且自动加载器会将类名解析为类文件的目录,正确的加载类。但它有一个缺点:类名太长了,尤其是目录结构越来越深时,输入这样的类简直是受罪。

    命名空间使用

    声明命名空间就是在代码文件<?php之后使用namespace关键字,在之后加上命名空间的名字,如:namespace Zend;
    上面只是声明了一层的命名空间,还可以使用\声明多级的命名空间,如:namespace Zend\Cloud;
    这样就可以有组织的将不同的类放到不同的文件中。
    要做代码中使用这些类,要做的只是就是将这个类的命名空间在代码中引入:
    use Zend\Cloud\ClassName as Cname;
    在上面的代码中,使用use语句将指定类的命名空间引入,同时使用了as关键字定义了类的别名,这样在类名很长时可以定义简短的类名。
    可以使用一个use关键字,后台跟随要引入的所有类:
    <?php
    use Zend\Cloud\Class1, Zend\Cloud\Class2;
    但是这样不易读,推荐每一个use只引入一个类:
    <?php
    use Zend\Cloud\Class1;
    use Zend\Cloud\Class2;
    在PHP5.6之后,代码中不只是可以引入类,还可以引入常量和函数:
    <?php
    use function Zend\Cloud\functionName as func;
    use const Zend\Cloud\CONSTANT;
    在PHP7.0之后又加入了分组引入,可以将一个命名空间内的方法,类,常量有选择的进行引入,减少了输入:
    use some\namespace{ClassA, ClassB, ClassC as C};
    use function some\namespace{fn_a, fn_b, fn_c};
    use const some\namespace{ConstA, ConstB, ConstC};

    其他

    1、一个文件多个命名空间
    可以在一个文件中定义多个命名空间,但是这样就违背了“一个文件一个类”的良好实践,并且命名空间的使用也会让人疑惑。
    2、全局命名空间
    全局命名空间,也即是PHP默认的命名空间,PHP自带的那些方法和类都在全局命名空间中,要使用全局的命名空间,在命名空间前面加上\。
    3、自动加载
    在PHP中定义了spl_autoload_register和spl_autoload_unregister用来注册和取消注册类的自动加载方法,方便类的加载使用。

    相关文章

      网友评论

          本文标题:命名空间

          本文链接:https://www.haomeiwen.com/subject/gylowttx.html