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”
那么,您有关于此的更多信息吗? 感谢
答案 0 :(得分:4)
这与使用相对vs绝对文件/ uri路径没有什么不同,并且将归结为首选项。但是,与绝对路径不同,我同意不那么模糊\My\Namespace
,因为它永远不会破坏,相对命名空间可以。{/ p>
命名空间别名,通过use
增加了相对命名空间名称的含义。例如,我可以说:use \PDO as YourMom
然后在代码中调用YourMom
。它被调用是\PDO
,\YourMOM
还是YourMom
?显然,别名获胜并被解析为\PDO
,假设没有冲突,但它使代码很难遵循。
修改强>
可以证明歧义的代码示例。如果名称空间不合格,请确保您看到应用了全局 fallback 。
正如@netcoder所提到的,在命名空间的声明期间是不可能的。因此,namespace My
和namespace \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';