PHP别名/导入:全局访问还是别名?

时间:2016-04-27 12:19:43

标签: php namespaces

在PHP中,似乎有以下的别名/使用类的方法,在本例中是一个驻留在\Foo\Bar的类。

// access via global namespace
$bar = new \Foo\Bar;

// switch into namespace (probably worst option)
namespace Foo;
$bar = new Bar;

// alias namespace
use Foo;
$bar = new Foo\Bar;

// alias specific class
use Foo\Bar;
$bar = new Bar;

两个最常见的选项似乎是通过全局命名空间(第一个选项)访问或别名特定类(最后一个选项)。我什么时候应该使用另一个?

业界是否有既定的最佳实践?

1 个答案:

答案 0 :(得分:1)

首先,我在PSR standards中没有看到任何明确的建议。如果我错过了这里的任何内容,请纠正我。这就是为什么我在下面写的所有内容都是我的个人观点,但不是既定标准。

其次,我认为这取决于。让我对每个案例发表评论。

// switch into namespace (probably worst option)
namespace Foo;
$bar = new Bar;

我认为没有任何理由尝试这样做,而且很可能这不起作用。至少你不能在同一个文件中多次切换命名空间。查看PHP文档中的Defining namespaces部分。

  

包含命名空间的文件必须在顶部声明命名空间   任何其他代码之前的文件 - 有一个例外:声明   关键字。

// access via global namespace
$bar = new \Foo\Bar;

为什么不呢?例如,您可以撰写\PDOException\stdClass并且不要导入它。我个人总是从全局命名空间导入类,但这只是我的爱好。我看到其他人做同样的事情的原因我在未导入全局命名空间的类时看到了很多例子。

// alias namespace
use Foo;
$bar = new Foo\Bar;

当您需要来自其他命名空间的许多类时,这不是一个坏主意。导入Doctrine\ORM\Mapping注释时的常见示例。查看Symfony Doctrine tutorial

中的示例
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

这清楚地表明Column类属于Doctrine\ORM\Mapping命名空间。您不需要导入所有类,我认为它甚至看起来更好,而不是在您编写时

/**
 * @Column(type="integer")
 * @Id
 * @GeneratedValue(strategy="AUTO")
 */
private $id;

因为它允许对注释进行分组并显示这些注释是针对ORM的,因为如果愿意,可能会有其他注释。

// alias specific class
use Foo\Bar;
$bar = new Bar;

我认为这是最常见的情况,当您需要来自命名空间的几个类并多次使用它们时。因此,如果您使用命名空间来设置短名称而不是名称,则可能会提高可读性。您可以set alias导入类以提高可读性并避免冲突。