时间:2021-07-01 10:21:17 帮助过:19人阅读
首先让我们看一个小例子。
- <?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" 的 "foo" 方法
- // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
- ?>
仔细观察上面的小例子,我们可以观察到什么?当当当,我们现在就给出答案。
在函数调用的时候,如果我们只写了“foo()
”,先调用的命名空间中的函数,然后在调用全局函数;但如果是“\foo()
”,这就只调用全局函数了。
在类应用的时候,如果我们写了“new B();
”,将会创建命名空间中定义的类"B"的一个对象,但如果未找到,则尝试自动装载类"A\B
"。
在调用另一个命名空间中的静态方法或命名空间函数的时候,如何我们写了“B\foo()
”,这表明我们将调用命名空间中的函数“foo()
”;但如果写的是“B::foo();
”就不一样了,他先调用命名空间中的函数“foo()”,但如果未找到,则尝试自动装载类"A\B"。
在当前命名空间中的静态方法或函数的时候,如何我们写了“A\B::foo();
”,这表明我们会调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法,在没有找到的情况下,自动装载类 "A\A\B"。
现在让我们归纳一下。
完全限定函数、类和常量的调用将会在编译的时候解析。例如,new\a\B解析为类a\B。
所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译的时候进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
所有非限定名和限定名(非完全限定名)都在编译时根据当前导入规则进行转换。例如,如果命名空间a\B\C作为C导入,则对C\D\e()的调用将转换为a\B\C\D\e()。
非限定类名在编译时根据当前导入规则进行转换(将短导入名替换为全名)。例如,如果命名空间a\B\C作为C导入,则新的C()将转换为新的a\B\C()。
在命名空间(例如,a\b)中,对非限定名称的函数调用在运行时解析。例如,对函数foo()的调用解析如下:
在当前命名空间中查找名为 A\B\foo() 的函数
尝试查找并调用 全局(global) 空间中的函数 foo()。
对命名空间(如a\b)内的非限定名或限定名类(非完全限定名)的调用在运行时解析。以下是调用new c()和new d\e()的解析过程:解析new c():
在当前命名空间中查找A\B\C类。
尝试自动装载类A\B\C。
new D\E()的解析:
在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
尝试自动装载类 A\B\D\E。
为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()。
就说到这里了,有其他想知道的,可以点击这个哦。→ →php视频教程
以上就是小编带你学命名空间的调用顺序的详细内容,更多请关注gxlcms其它相关文章!