经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP中命名空间是怎样的存在?(二)
来源:cnblogs  作者:硬核项目经理  时间:2021/3/8 12:03:04  对本文有异议

今天带来的依然是命名空间相关的内容,本身命名空间就是PHP中非常重要的一个特性。所以关于它的各种操作和使用还是非常复杂的,光使用方式就有很多种,我们一个一个的来看。

子命名空间

命名空间本身就像目录一样,所以命名空间当然也是可以定义子命名空间的,真的就和操作系统的各种目录层级是完全一样的。我们通过简单的例子来看看。首先还是创建三个php文件,其中3-2和3-2-1是使用的相同的二级命名空间,3-2-1在FILE32的基础上继续向下扩展了第三级的命名空间FILE321。他们都是MyProject命名空间的子命名空间。

  1. // file3-1.php
  2. namespace MyProject\FILE31;
  3. function testA31(){
  4. echo 'FILE31\testA()', PHP_EOL;
  5. }
  6. // file3-2.php
  7. namespace MyProject\FILE32;
  8. const CONST_A32 = "file3-2";
  9. function testA32(){
  10. echo 'FILE32\testA()', PHP_EOL;
  11. }
  12. class objectA32{
  13. function test(){
  14. echo 'FILE32\ObjectA', PHP_EOL;
  15. }
  16. }
  17. // file3-2-1.php
  18. namespace MyProject\FILE32\FILE321;
  19. function testA321(){
  20. echo 'FILE321\testA()', PHP_EOL;
  21. }

接下来的使用就很简单了,和使用一级命名空间一样,直接使用use进行导入就可以了。

  1. // 子命名空间
  2. require 'namespace/file3-1.php';
  3. require 'namespace/file3-2.php';
  4. require 'namespace/file3-2-1.php';
  5. use MyProject\FILE31;
  6. use MyProject\FILE32;
  7. use MyProject\FILE32\FILE321;
  8. FILE31\testA31(); // FILE31\testA()
  9. FILE32\testA32(); // FILE32\testA()
  10. FILE32\FILE321\testA321(); // FILE321\testA()
  11. FILE321\testA321(); // FILE321\testA()

同一文件中定义多个命名空间

PHP是允许在一个文件中定义多个命名空间的,但是并不推荐这么做,因为这样可能会带来各种未知的混乱。在这里,我们只要了解到可以这样使用就行了,在日常的开发中还是尽量要避免。

  1. // file4.php
  2. namespace FILE41;
  3. function testA41(){
  4. echo 'FILE41\testA()', PHP_EOL;
  5. }
  6. namespace FILE42;
  7. function testA42(){
  8. echo 'FILE42\testA()', PHP_EOL;
  9. }

在使用中当然也和其他命名空间的使用没什么两样,直接use使用即可。

  1. // 一个文件中多个命名空间
  2. require 'namespace/file4.php';
  3. use FILE41, FILE42;
  4. FILE41\testA41(); // FILE41\testA()
  5. FILE42\testA42(); // FILE42\testA()

非限定名称、限定名称、完全限定名称

不要被术语吓到,这三个术语其实非常好理解。

  • 非限定名称,名称中不包含命名空间分隔符的标识符,例如 Foo 。
  • 限定名称,名称中含有命名空间分隔符的标识符,例如 Foo\Bar 。
  • 名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。

直接用例子来说就非常清晰了。

  1. // 非限定名称、限定名称、完全限定名称
  2. use MyProject\FILE32\objectA32 as obj32;
  3. $o = new obj32(); // 非限定名称
  4. $o->test(); // FILE32\ObjectA
  5. $o = new FILE32\objectA32(); // 限定名称
  6. $o->test(); // FILE32\ObjectA
  7. $o = new \MyProject\FILE32\objectA32(); // 完全限定名称
  8. $o->test(); // FILE32\ObjectA

namespace关键字和__NAMESPACE__常量

  • namesapce,显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
  • NAMESPACE,包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

也是很简单的内容吧,直接来看例子。

  1. // file5.php
  2. namespace FILE5;
  3. function test(){
  4. echo __NAMESPACE__ . ': test()', PHP_EOL;
  5. }
  6. // test.php
  7. namespace Pro;
  8. // namespace与__NAMESPACE__
  9. require 'namespace/file5.php';
  10. function test(){
  11. echo __NAMESPACE__ . ': test()', PHP_EOL;
  12. }
  13. namespace\test(); // Pro: test()
  14. \FILE5\test(); // FILE5: test()

我们给当前命名空间定义为Pro,引入了file5文件。这两个文件中都有一个test()方法,test()方法内都输出了__NAMESPACE__来打印当前的命名空间名称。然后在test.php中,通过namespace关键字调用的就是当前文件的Pro命名空间中的test()方法,输出的是 Pro: test() 。直接使用完全限定名称调用FILE5的test()方法,输出了 FILE5: test() 。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%BA%8C%EF%BC%89%20.php

参考文档:
https://www.php.net/manual/zh/language.namespaces.nsconstants.php
https://www.php.net/manual/zh/language.namespaces.rules.php
https://www.php.net/manual/zh/language.namespaces.nested.php
https://www.php.net/manual/zh/language.namespaces.definitionmultiple.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14478380.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号