了解命名空间
来源:互联网 发布: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的命名空间类名总有三种方式
非限定名称,或不包含前缀的类名称,例如 $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。
下面从官网找来一张图,详细的介绍了类名的引用
<?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"?>
总结
命名空间应用非常广泛,想要了解命名空间的运行原理还要去了解自动加载。这里就不说了
如有不准确的地方欢迎指正
- 了解 XML 命名空间
- 了解命名空间
- xml-了解 XML 命名空间
- 了解.Net的命名空间
- XML 模式:了解命名空间
- 初步了解C++命名空间
- 一个简单例子让你了解C++命名空间
- 初步了解C++命名空间(加了继承)
- Struts2之命名空间详解及JSP文件上传了解
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- Android获取当前位置(GPS和网络定位)
- 学习消息队列(一)
- perl (\S\s+)+
- 常用链接整理
- web安全之XSS浅析
- 了解命名空间
- 基于讯飞开放平台的安卓语音开发——语音听写(语音→文本)
- 设计模式(4)策略模式
- 二次采样
- 基于讯飞开放平台的安卓语音开发——语音合成(文本→语音)
- Nacicat for Oracle 绿色版 亲测可用
- 我的第一个blog
- Listview多条目加载
- 斗地主之目前的问题