上一篇文章中我们了解了访问命名空间内部元素,有需要的请看《小编带你了解如何访问命名空间内部元素(php版)》。这次我们向大家介绍命名空间的顺序,有需要的可以参考参考。
首先让我们看一个小例子。
<?php namespace A; use BD, CE as F; // 函数调用 foo(); // 首先尝试调用定义在命名空间"A"中的函数foo() // 再尝试调用全局函数 "foo" foo(); // 调用全局空间函数 "foo" myfoo(); // 调用定义在命名空间"Amy"中函数 "foo" F(); // 首先尝试调用定义在命名空间"A"中的函数 "F" // 再尝试调用全局函数 "F" // 类引用 new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象 // 如果未找到,则尝试自动装载类 "AB" new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象 // 如果未找到,则尝试自动装载类 "BD" new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象 // 如果未找到,则尝试自动装载类 "CE" new B(); // 创建定义在全局空间中的类 "B" 的一个对象 // 如果未发现,则尝试自动装载类 "B" new D(); // 创建定义在全局空间中的类 "D" 的一个对象 // 如果未发现,则尝试自动装载类 "D" new F(); // 创建定义在全局空间中的类 "F" 的一个对象 // 如果未发现,则尝试自动装载类 "F" // 调用另一个命名空间中的静态方法或命名空间函数 Bfoo(); // 调用命名空间 "AB" 中函数 "foo" B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法 // 如果未找到类 "AB" ,则尝试自动装载类 "AB" D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法 // 如果类 "BD" 未找到,则尝试自动装载类 "BD" Bfoo(); // 调用命名空间 "B" 中的函数 "foo" B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法 // 如果类 "B" 未找到,则尝试自动装载类 "B" // 当前命名空间中的静态方法或函数 AB::foo(); // 调用命名空间 "AA" 中定义的类 "B" 的 "foo" 方法 // 如果类 "AAB" 未找到,则尝试自动装载类 "AAB" AB::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法 // 如果类 "AB" 未找到,则尝试自动装载类 "AB" ?>
仔细观察上面的小例子,我们可以观察到什么?当当当,我们现在就给出答案。
在函数调用的时候,如果我们只写了“foo()
”,先调用的命名空间中的函数,然后在调用全局函数;但如果是“foo()
”,这就只调用全局函数了。
在类应用的时候,如果我们写了“new B();
”,将会创建命名空间中定义的类”B”的一个对象,但如果未找到,则尝试自动装载类”AB
“。
在调用另一个命名空间中的静态方法或命名空间函数的时候,如何我们写了“Bfoo()
”,这表明我们将调用命名空间中的函数“foo()
”;但如果写的是“B::foo();
”就不一样了,他先调用命名空间中的函数“foo()”,但如果未找到,则尝试自动装载类”AB”。
在当前命名空间中的静态方法或函数的时候,如何我们写了“AB::foo();
”,这表明我们会调用命名空间 “AA” 中定义的类 “B” 的 “foo” 方法,在没有找到的情况下,自动装载类 “AAB”。
现在让我们归纳一下。
- 完全限定函数、类和常量的调用将会在编译的时候解析。例如,newaB解析为类aB。
- 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译的时候进行转换。例如,如果命名空间 ABC 被导入为 C,那么对 CDe() 的调用就会被转换为 ABCDe()。
- 所有非限定名和限定名(非完全限定名)都在编译时根据当前导入规则进行转换。例如,如果命名空间aBC作为C导入,则对CDe()的调用将转换为aBCDe()。
- 非限定类名在编译时根据当前导入规则进行转换(将短导入名替换为全名)。例如,如果命名空间aBC作为C导入,则新的C()将转换为新的aBC()。
- 在命名空间(例如,ab)中,对非限定名称的函数调用在运行时解析。例如,对函数foo()的调用解析如下:
- 在当前命名空间中查找名为 ABfoo() 的函数
- 尝试查找并调用 全局(global) 空间中的函数 foo()。
- 对命名空间(如ab)内的非限定名或限定名类(非完全限定名)的调用在运行时解析。以下是调用new c()和new de()的解析过程:解析new c():
- 在当前命名空间中查找ABC类。
- 尝试自动装载类ABC。
- new DE()的解析:
- 在类名称前面加上当前命名空间名称变成:ABDE,然后查找该类。
- 尝试自动装载类 ABDE。
- 为了引用全局命名空间中的全局类,必须使用完全限定名称 new C()。
以上就是小编带你学命名空间的调用顺序的详细内容,更多请关注亿码酷站其它相关文章!
转载请注明来源:小编带你学命名空间的调用顺序
本文永久链接地址:https://www.ymkuzhan.com/36831.html
本文永久链接地址:https://www.ymkuzhan.com/36831.html
下载声明:
本站资源如无特殊说明默认解压密码为www.ymkuzhan.com建议使用WinRAR解压; 本站资源来源于用户分享、互换、购买以及网络收集等渠道,本站不提供任何技术服务及有偿服务,资源仅提供给大家学习研究请勿作它用。 赞助本站仅为维持服务器日常运行并非购买程序及源码费用因此不提供任何技术支持,如果你喜欢该程序,请购买正版! 版权声明:
下载本站资源学习研究的默认同意本站【版权声明】若本站提供的资源侵犯到你的权益,请提交版权证明文件至邮箱ymkuzhan#126.com(将#替换为@)站长将会在三个工作日内为您删除。 免责声明:
您好,本站所有资源(包括但不限于:源码、素材、工具、字体、图像、模板等)均为用户分享、互换、购买以及网络收集而来,并未取得原始权利人授权,因此禁止一切商用行为,仅可用于个人研究学习使用。请务必于下载后24小时内彻底删除,一切因下载人使用所引起的法律相关责任,包括但不限于:侵权,索赔,法律责任,刑事责任等相关责任,全部由下载人/使用人,全部承担。以上说明,一经发布视为您已全部阅读,理解、同意以上内容,如对以上内容持有异议,请勿下载,谢谢配合!支持正版,人人有责,如不慎对您的合法权益构成侵犯,请联系我们对相应内容进行删除,谢谢!