php use 操作符闲话

来源:互联网 发布:唐韦星追王晨星知乎 编辑:程序博客网 时间:2024/06/05 23:05

use 操作符类似于 C++ 中的 using 语句。

在 PHP 中,use 操作符完成的工作称之为取别名。具体可以分为:

  1. 为类名称使用别名
  2. 为接口使用别名
  3. 为命名空间名称使用别名
  4. PHP 5.6开始允许导入函数或常量或者为它们设置别名。

use 的用法并不难掌握,但这里基于如下例子特别谈两点。

假如在全局命名空间有一个名为 Another 的类,请问就下面的代码而言,$obj1 和 $obj2 分别是实例化的是哪个类?

<?phpnamespace 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 的实例。

最后很有意思的一点是,当我们在一个命名空间中,调用全局命名空间中的函数时,如果该命名空间中没有同名函数,函数名并不需要使用前导 \ 对函数名进行限定。

<?phpnamespace foo;$r = func()?>

比如上面的代码,PHP 会调用全局命名空间中的 func 函数,而不是调用 foo\func;当然如果 foo 命名空间中定义了同名函数,这时如果还想调用全局命名空间中的 func 函数,还是需要使用前导 \ 对函数名进行限定的。

原创粉丝点击