php中命名空间的使用

简单使用


命名空间主要解决函数/类冲突的问题。由于PHP中中不允许函数重载,所以我们要使用的到命名空间的。先看一个简单的例子。

<?php
    
    namespace A;
    public function test(){
        return "hello";
    }

    namespace B;
    public function test(){
        return 'world';
    }

    echo test();

如果我们不加命名空间,则php就会报错。加了之后,上面的输出结果如下:

这是因为在函数调用时候,会采用就近原则来使用命名空间,所以会调用空间B下的test()函数。如果需要使用A中的test,则需要采用下面的方式。

echo A	est();

子空间使用


 

命名空间采用的是树形结构,根节点为空。如A est()表示访问跟根节点下的A空间下的Test方法。当然,还可以在某个空间下继续定义空间,我们称之为子空间。

<?php
    
    namespace A;
    function test(){
        return "hello";
    }

    namespace B;
    function test(){
        return 'world';
    }

    namespace AC;
    function test(){
        return "!";
    }

    echo AC	est();

在A空间下有定义了一个C空间,我们想要使用C空间下的test()方法,则test()前面加上空间的绝对路径即可。

注意在定义空间时也应该使用绝对定位,比如想要在C下再定义一个子空间,那么应该是 namespace ACD ,而不是 namespace CD 

空间引入


在调用别的空间下的函数时,需要加上绝对路径。如果路径很长则书写代码不方便。为了简化操作,我们可以通过引入空间来调用函数。

<?php
    
    namespace A;
    function test(){
        return "hello";
    }

    namespace ACDE;
    function test(){
        return "!";
    }

    namespace B;
    function test1(){
        return 'world';
    }

    function test2(){
        return '!!!';
    }
    
    use ACDE;
    echo E	est();

在代码种定义了一个多级空间ACDE,如果不引入空间的话则需要这样来调用 echo ACDE est() ,当我们引入空间后调用就方便了许多。

如果某个空间下定义了类,还可以直接将该类引入。

<?php
    
    namespace A;
    function test(){
        return "hello";
    }

    /**
    *   
    */
    class Person{
        
        static $name = 'ff';
    }

    namespace ACDE;
    function test(){
        return "!";
    }

    namespace B;
    function test1(){
        return 'world';
    }

    function test2(){
        return '!!!';
    }
    
    use ACDE;
    echo E	est();

    use APerson;
    echo Person::$name;

直接将Person类引入,然后访问其静态成员。

公共空间


如果PHP脚本文件中没有定义空间,那么其空间被认为是公共空间。

  • 公共空间引入自定义空间
<?php
    require_once 'custom.php';

    function test(){
        return 'aa';
    }

   echo A	est();

 调用custom.php文件中A空间下的test()方法。

  • 自定义空间引入公共空间
<?php
    namespace A;
    require_once 'test.php';
    function test(){
        return '!!!';
    }

    echo 	est();

 当前的空间是A空间,这里调用公共空间下的test()方法。

 注意:如果要使用namespace,则namspace必须是第一行代码。

    define定义的常量不受命名空间的限制

原文地址:https://www.cnblogs.com/xidongyu/p/5602944.html