命名空间的作用
解决文件中引用另一个文件时存在相同类名,函数名以及常量名的问题,比如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的命名空间类名总有三种方式
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod(),foo 将被解析为 currentnamespace\foo
限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(),如果当前的命名空间是 currentnamespace,则 foo 被解析为currentnamespace\subnamespace\foo
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
下面从官网找来一张图,详细的介绍了类名的引用
<?php
namespace 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"
?>
总结
命名空间应用非常广泛,想要了解命名空间的运行原理还要去了解自动加载。这里就不说了
如有不准确的地方欢迎指正