了解命名空间

来源:互联网 发布:java web三层架构和mvc 编辑:程序博客网 时间:2024/05/16 14:06

命名空间的作用

解决文件中引用另一个文件时存在相同类名,函数名以及常量名的问题,比如test.php文件如下

这里写图片描述

然后在test1.php中加载这个文件

这里写图片描述

如果两者的命名空间相同,包括两者都没有设置命名空间的情况下,执行test1.php会报冲突,因为两个文件有相同的类Test,这是不被允许的,然而命名空间可以很好的解决这个问题,如果将test1.php的命名空间进行修改,如下:

这里写图片描述

现在两个文件的类Test在不同的命名空间下,因此不会发生冲突,不过具体要实例化哪个类,且看下文分析

use的作用

use只是用来使命名空间引用时更简洁,比如我们想使用类app\first\Test,那么我们只需要在开头加

use app\first\Testh 或者 use app\first\Test as Test

以后就不用麻烦的写全命名空间,直接new Test,就制定了app\first这个命名空间,总结的说use就是一个设置别名的作用

这里写图片描述

上图实例化的就是app\first下的Test类,
这里需要注意的是,use的别名不能等于当前文件中的类名!!

命名空间类名

php的命名空间类名总有三种方式

  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod(),foo 将被解析为 currentnamespace\foo

  2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(),如果当前的命名空间是 currentnamespace,则 foo 被解析为currentnamespace\subnamespace\foo

  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

    下面从官网找来一张图,详细的介绍了类名的引用

<?phpnamespace A;use B\D, C\E as F;// 函数调用foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()            // 再尝试调用全局函数 "foo"\foo();     // 调用全局空间函数 "foo" my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" F();        // 首先尝试调用定义在命名空间"A"中的函数 "F"             // 再尝试调用全局函数 "F"// 类引用new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象            // 如果未找到,则尝试自动装载类 "A\B"new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象            // 如果未找到,则尝试自动装载类 "B\D"new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象            // 如果未找到,则尝试自动装载类 "C\E"new \B();   // 创建定义在全局空间中的类 "B" 的一个对象            // 如果未发现,则尝试自动装载类 "B"new \D();   // 创建定义在全局空间中的类 "D" 的一个对象            // 如果未发现,则尝试自动装载类 "D"new \F();   // 创建定义在全局空间中的类 "F" 的一个对象            // 如果未发现,则尝试自动装载类 "F"// 调用另一个命名空间中的静态方法或命名空间函数B\foo();    // 调用命名空间 "A\B" 中函数 "foo"B::foo();   // 调用命名空间 "A" 中定义的类 "B""foo" 方法            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D""foo" 方法            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"\B\foo();   // 调用命名空间 "B" 中的函数 "foo" \B::foo();  // 调用全局空间中的类 "B""foo" 方法            // 如果类 "B" 未找到,则尝试自动装载类 "B"// 当前命名空间中的静态方法或函数A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B""foo" 方法              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B""foo" 方法              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"?>

总结

命名空间应用非常广泛,想要了解命名空间的运行原理还要去了解自动加载。这里就不说了

如有不准确的地方欢迎指正
原创粉丝点击