95. PHP 名称解析规则
来源:互联网 发布:方舟生存进化优化 编辑:程序博客网 时间:2024/05/29 16:50
名称解析规则
在说明名称解析规则之前,我们先看一些重要的定义:
命名空间名称定义 非限定名称Unqualified name
名称中不包含命名空间分隔符的标识符,例如 Foo
限定名称Qualified name
名称中含有命名空间分隔符的标识符,例如 Foo\Bar
完全限定名称Fully qualified name
名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。
名称解析遵循下列规则:
1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。
2. 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
3. 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C() 。
5. 在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的: 1. 在当前命名空间中查找名为 A\B\foo() 的函数
2. 尝试查找并调用 全局(global) 空间中的函数 foo()。
- 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析: 1. 在当前命名空间中查找A\B\C类。
- 尝试自动装载类A\B\C。
new D\E()的解析: 1. 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。 - 尝试自动装载类 A\B\D\E。
为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。
Example #1 名称解析示例
<?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"?>
- 95. PHP 名称解析规则
- PHP命名空间的名称解析规则
- 变量名称解析规则
- 名称解析规则
- php 路由解析规则
- php 路由解析规则
- PHP命名空间解析规则
- 名称解析
- C++基本名称规则
- 运营商名称显示规则
- PHP命名空间规则解析及高级功能
- PHP命名空间规则解析及高级功能
- PHP中变量的声明、作用范围和解析规则
- 项目中的名称约定规则
- Nginx中的服务器名称规则
- Androd项目名称命名规则
- Python LGB名称查找规则
- PHP命名空间解析规则(告别PHP namespace给你带来的纠结)
- fork函数总结
- 苹果6来了,都排队去抢!
- 基本数据类型及对象包装类
- jxl 设置excel 字体 背景色 合并单元格 列宽
- L#汉化者信息
- 95. PHP 名称解析规则
- [LeetCode] Factorial Trailing Zeroe
- 二十、Linux系统编程-管道(一)管道、匿名管道、管道读写规则
- C++获取本机MAC地址
- Project configuration is not up-to-date with pom.xml错误解决方法
- zoj 1242 Carbon Dating
- 黑马程度员——ios基础—— static 和 extern
- LRU Cach Java
- juery