use 操作符类似于 C++ 中的 using 语句。
在 PHP 中,use 操作符完成的工作称之为取别名。具体可以分为:
- 为类名称使用别名
- 为接口使用别名
- 为命名空间名称使用别名
- PHP 5.6开始允许导入函数或常量或者为它们设置别名。
use 的用法并不难掌握,但这里基于如下例子特别谈两点。
假如在全局命名空间有一个名为 Another 的类,请问就下面的代码而言,$obj1 和 $obj2 分别是实例化的是哪个类?
<?php
namespace foo;
$obj1 = new Another;
$obj2 = new \Another;
?>
答案是 $obj1 实例化的是 foo\Another 这个类(如果这个类不存在就会报错);$obj2 实例化的是全局命名空间中的 Another 类。
而我刚开始基于自己 C++ 的基础,认为 $obj1 实例化是全局命名空间中的 Another 类。但事实是 PHP 的命名空间和 C++还是有区别的。
就上面的例子而言,一点是对类名的解析,一点就是全局空间。
PHP 的全局空间使用 \ 来表示,就是说如果我们要使用全局命名空间中的一个类,必须像 $obj2 那样,使用 \ 来限定这个类;因为在 php 中实例化一个类时,如果这个类名不是完全限定的,比如上面的 new Another,PHP会基于当前命名空间去解析这个类名,所以 $obj1 才会被解析为 foo\Another 的实例。
最后很有意思的一点是,当我们在一个命名空间中,调用全局命名空间中的函数时,如果该命名空间中没有同名函数,函数名并不需要使用前导 \ 对函数名进行限定。
<?php
namespace foo;
$r = func()
?>
比如上面的代码,PHP 会调用全局命名空间中的 func 函数,而不是调用 foo\func;当然如果 foo 命名空间中定义了同名函数,这时如果还想调用全局命名空间中的 func 函数,还是需要使用前导 \ 对函数名进行限定的。