PHP名称空间:\My\Namespace还是My\Namespace? My\Namespace \My\Namespace
那么,我应该使用哪一个呢?我看到的用法主要是PHP名称空间:\My\Namespace还是My\Namespace? My\Namespace \My\Namespace,php,namespaces,php-5.3,Php,Namespaces,Php 5.3,那么,我应该使用哪一个呢?我看到的用法主要是My\Namespace 但是据说\My\Namespace更好,因为它没有歧义,而My\Namespace可以解析为\RandomNamespace\My\Namespace 在阅读了之后,我开始对这一点感到疑惑。在教义2中有一个关于这一点的问题:“ 那么,你有更多关于这方面的信息吗? 谢谢这与使用相对与绝对文件/uri路径没有什么不同,取决于您的偏好。然而,与绝对路径不同,我同意不那么模棱两可的\My\Namespace,因为它永远不会中断,而相对
My\Namespace
但是据说\My\Namespace
更好,因为它没有歧义,而My\Namespace
可以解析为\RandomNamespace\My\Namespace
在阅读了之后,我开始对这一点感到疑惑。在教义2中有一个关于这一点的问题:“
那么,你有更多关于这方面的信息吗?
谢谢这与使用相对与绝对文件/uri路径没有什么不同,取决于您的偏好。然而,与绝对路径不同,我同意不那么模棱两可的
\My\Namespace
,因为它永远不会中断,而相对名称空间可能会中断
名称空间别名,通过use
增加相对名称空间名称的准确性。例如,我可以说:use\PDO as YourMom
,然后在代码中调用YourMom
。被调用的是\PDO
、\YourMOM
还是YourMOM
?显然,如果没有冲突,别名将获胜并解析为\PDO
,但这会使代码难以遵循
编辑
代码示例证明了这种可能性。如果命名空间不合格,请确保看到应用的全局
正如@netcoder所提到的,在名称空间的声明过程中不可能是无关联的。因此,namespace My
和namespace\My
(或替换下面的任何其他名称空间声明)与名称空间完全相同,并且声明完全限定了名称空间
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
}
在名称空间声明本身中,它没有区别。此声明始终定义一个完整的限定名,因此可以安全地省略前导的命名空间分隔符。
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;
在所有其他情况下,前导分隔符确保给定的限定符为absolut,如果缺少,则为relative。看看他们是如何解决的
如果您只使用来自同一名称空间的类和/或通过
use
(可能是as
)在文件顶部“声明”每个类,您可以安全地使用相对类标识符。实际上存在差异,但并不总是(啊,对)
在使用
结构中,您永远不必“提及”前导的\
。如果类位于同一名称空间中,或者如果使用导入(通过导入,请使用ns
),则无需内联
但有时你必须:
namespace foo;
class bar extends \baz\Bar {
您使用的是一个未定义/未知/未导入的内联类,因此必须提到它的源代码
另一个示例是命名空间中使用的未命名类,内联:
namespace foo;
$dt = new \DateTime;
最佳实践(通常)是导入当前文件所需的所有类。use语句非常非常便宜,所以不要犹豫
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';
“在使用构造中,您永远不必‘提及’前导\”:为什么?(我只是想把所有的部分放在一起)@MatthieuNapoli,因为
use
总是从根开始工作。前导的``是隐含的,因此不需要键入。不穿衣服干净多了。哇,这个回复只晚了2.5年…晚回复仍然是回复:)