了解命名空间

命名空间的作用

解决文件中引用另一个文件时存在相同类名,函数名以及常量名的问题,比如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的命名空间类名总有三种方式

  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod(),foo 将被解析为 currentnamespace\foo

  2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(),如果当前的命名空间是 currentnamespace,则 foo 被解析为currentnamespace\subnamespace\foo

  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

    下面从官网找来一张图,详细的介绍了类名的引用

<?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" 中定义的类 "B""foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

总结

命名空间应用非常广泛,想要了解命名空间的运行原理还要去了解自动加载。这里就不说了

如有不准确的地方欢迎指正
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值