PHP命名空间:\ My \ Namespace或My \ Namespace?

时间:2011-04-08 21:49:12

标签: php namespaces php-5.3

  • My\Namespace
    • \My\Namespace

那么,我应该使用哪一个,我看到php documentation主要使用My\Namespace

但据说\My\Namespace更好,因为不明确,而My\Namespace可以解析为\RandomNamespace\My\Namespace

在阅读 Doctrine 2中有关于此的问题后,我开始怀疑这个问题:“Please replace 'Doctrine\XXX\YYY' with '\Doctrine\XXX\YYY' in code and document

那么,您有关于此的更多信息吗? 感谢

3 个答案:

答案 0 :(得分:4)

这与使用相对vs绝对文件/ uri路径没有什么不同,并且将归结为首选项。但是,与绝对路径不同,我同意不那么模糊\My\Namespace,因为它永远不会破坏,相对命名空间可以。{/ p>

命名空间别名,通过use增加了相对命名空间名称的含义。例如,我可以说:use \PDO as YourMom然后在代码中调用YourMom。它被调用是\PDO\YourMOM还是YourMom?显然,别名获胜并被解析为\PDO,假设没有冲突,但它使代码很难遵循。

修改

可以证明歧义的代码示例。如果名称空间不合格,请确保您看到应用了全局 fallback

正如@netcoder所提到的,在命名空间的声明期间是不可能的。因此,namespace Mynamespace \My(或交换下面的任何其他命名空间声明)100%完全相同,并且声明完全限定命名空间。

namespace My
{
}

namespace My\Other
{
    use Bob; // Resolves to \My\Other\Bob
}

namespace My\Other\NS
{
    use \My\Other as Other;
    use Other\NS as Duh; // This resolves to \My\Other\NS
}

namespace My\Other\Bob
{
    use Other\NS as Duh; // This resolves to \Other\NS becuase the namespace doesn't exist inside \My\Other\Bob
}

答案 1 :(得分:3)

在命名空间声明本身中没有区别。此声明始终定义完整限定名称,因此您可以安全地省略前导命名空间分隔符。 use语句也是如此。

namespace My\Namespace;
// Is exactly the same as 
namespace \My\Namespace;

use Foo\Bar as Class1;
// Is exactly the same as 
use \Foo\Bar as Class2;

在所有其他情况下,前导分隔符确保给定限定符是绝对值,如果缺少,则为相对值。请参阅the manual了解如何解决这些问题。

如果您只使用同一命名空间中的类和/或通过use(可能是as)“声明”文件顶部的每个类,则可以安全地使用相对类标识符。 / p>

答案 2 :(得分:2)

实际上存在差异,但并非总是如此(对啊)。

use构造中,您永远不必“提及”前导\。如果类在同一名称空间中,或者您正在使用导入(使用use ns导入),则内联您永远不会。

但有时你必须:

namespace foo;

class bar extends \baz\Bar {

您正在使用未定义/未知/未排序的内联类,因此您必须提及其来源。

另一个例子是命名空间中使用的无名空间类,内联:

namespace foo;

$dt = new \DateTime;

最佳实践(通常)是导入当前文件所需的所有类。使用声明非常,非常,非常便宜,所以不要拖延。

namespace foo;

use baz\Bar AS OtherBar;
use \DateTime;

class Bar extends OtherBar { // or something like that; in this case (same class name) it's tricky
  function __construct() {
    $dt = new DateTime;

编辑1
另外,在将它们作为字符串传递时,不要忘记使用完全命名空间的类名,即使您可能位于正确的命名空间中:

namespace foo;

$class = 'foo\bar';