PHP命名空间的好处

use*_*341 5 php namespaces

在对PHP中的命名空间进行一些研究之后,我试图弄清楚除了将库项目组合在一起并重复使用相同的类名之外还有什么真正的好处.

关于名称空间我不喜欢的是这些额外的行位于文件的顶部,你从'use core\whatever\class'调用类,这与标准方法没有关系.

另外 - 我无法找到有关的信息 - 在我们需要使用两个具有相同名称的类但在不同文件夹中包含相同方法名称的情况下会发生什么?我们仍然需要调用命名空间,但代码如何确定应该使用哪个类的方法?

我刚开始使用命名空间,请原谅我这个问题听起来很基本.

另外 - 它如何与静态方法一起工作 - 例如Helper类 - 我是否还必须指出我需要这个命名空间'use core\whatever\Helper'?

dec*_*eze 12

如果你有一个包含许多类的大项目,你最终会遇到命名冲突.你有一个db/mysql/adapter.php和一个http/curl/adapter.php.要在没有名称空间的情况下处理这个问题,你必须为你的类提供类似Db_Mysql_Adapter和的唯一名称Http_Curl_Adapter,并且每当你引用这些类时,你需要使用它们的全名.

命名空间允许您命名类Db\Mysql\Adapter,并Http\Curl\Adapter与简单地指他们Adapter在当地的命名空间,或Mysql\AdapterCurl\Adapter分别在其他命名空间.这可以节省大量的打字.

只需浏览Zend Framework 版本1版本2的源代码即可查看其中的差异.

在我们需要使用两个具有相同名称的类但在不同文件夹中包含相同方法名称的情况下会发生什么?我们仍然需要调用命名空间,但代码如何确定应该使用哪个类的方法?

如果您在命名空间中Db\Mysql,则Adapter::foo()引用Db\Mysql\Adapter\Http\Curl\Adapter::foo()引用另一个.如果您不想一直写出整个名称,也可以在文件顶部为该类添加别名:

namespace Db\Mysql;
use Http\Curl\Adapter as HAdapter;

Adapter::foo();  // Mysql adapter
HAdapter::foo(); // Http adapter, same as:
\Http\Curl\Adapter::foo();
Run Code Online (Sandbox Code Playgroud)