PHP use 命名空间时,为什么要精确到命名空间下的一个类

图片描述

在Tool.class.php 文件下的代码是:

namespace Company\Tool;

class Tool{

}

我的问题是为什么 在 其他文件下如果使用 Tool类 必须要这样写:use Company\Tool\Tool

我以为 只要写成 use Company\Tool 就行了(我理解的意思是可以使用这个空间下的任何类了)。
希望大家讲讲,谢谢了。

阅读 3.1k
3 个回答

C++就有你想要的using namespace xxx

为啥PHP不直接引入整个命名空间,这大概参与设计的人才知道了。

我猜原因是避免一次引入过多不需要的东西,批量引入在各种语言中都是不推荐的。

  1. 精确到类可以提高性能。若只是精确到某个目录,每次加载类的时候,编译器仍然需要去目录中寻找该类是否存在。

  2. 精确到类可以避免冲突,若2个目录存在相同的类名,若精确到类,则很好的对冲突进行避免。

  3. 易于优化,C#拥有楼主所说的特性,但是C#是直接编译成可执行文件,但是java则采取的是精确到类的做法,同为解释型语言,这样做的好处是有利于后期的解释优化,让类能精准的被找到,减少缓存的消耗。

可以 use 一个类,也可以 use 一个命名空间

namespace A;
class B
{
    public function test() {}
}

引用

namespace C;
use A;
$b = new A\B();
$b->test();

或者

namespace C;
use A\B;
$b = new B();
$b->test();

要是你那样写,势必会让autoload找不到这个文件。如果是手动载入文件的,从命名空间的理解出发也必须要那样写。而且我觉得提问的那个排版应该是namespace Company\Tool;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题