首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP名称空间:\My\Namespace还是My\Namespace?

PHP名称空间:\My\Namespace还是My\Namespace?
EN

Stack Overflow用户
提问于 2011-04-08 21:49:11
回答 3查看 1.9K关注 0票数 8
  • My\Namespace
    • \My\Namespace

所以,我应该使用哪一个,我看到php文档主要使用My\Namespace

但是据说\My\Namespace更好,因为它是明确的,而My\Namespace可以被解析为\RandomNamespace\My\Namespace

在阅读之后,我开始对此感到好奇,在第2条关于这个的理论中有一个问题:"请将代码和文档中的'Doctrine\XXX\YYY‘替换为'\Doctrine\XXX\YYY’

你还有更多关于这件事的信息吗?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-08 22:22:13

这与使用相对的和绝对的文件/uri路径没有什么不同,可以归结为首选项。但是,与绝对路径不同,我同意不那么含糊的\My\Namespace,因为它永远不会中断,相对命名空间可以这样做。

名称空间别名,通过use添加相对命名空间名称的能力。例如,我可以说:use \PDO as YourMom,然后在代码中调用YourMom。被调用的是\PDO\YourMOM还是YourMom?显然,在没有冲突的情况下,别名获胜并被解析为\PDO,但这使得代码很难理解。

编辑

可以通过代码示例来证明非依赖性。如果名称空间没有限定,请确保您看到应用了全局退却

正如@netcoder所提到的,在名称空间的声明中不可能是独立的。因此,namespace Mynamespace \My (或交换下面任何其他名称空间声明)与完全限定名称空间的声明完全相同。

代码语言:javascript
复制
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
}
票数 5
EN

Stack Overflow用户

发布于 2011-04-09 01:02:18

在名称空间声明本身中,它没有任何区别。此声明总是定义一个完整的限定名,因此您可以安全地省略前面的命名空间分隔符。对于use语句也是如此。

代码语言:javascript
复制
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;

在所有其他情况下,前导分隔符确保给定的限定符是绝对的,如果缺少,则是相对的。有关如何解决这些问题,请参见手册

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

票数 3
EN

Stack Overflow用户

发布于 2011-04-20 10:18:58

其实是有区别的,但也不总是(啊对)。

use构造中,您不必“提到”领先的\。如果类位于同一个命名空间中,或者使用导入(与use ns一起导入),则无需内联。

但有时你必须:

代码语言:javascript
复制
namespace foo;

class bar extends \baz\Bar {

您使用的是未定义/未知/未导入的内联类,因此必须提到它的源代码。

另一个示例是在名称空间中使用的未命名空间类,内联:

代码语言:javascript
复制
namespace foo;

$dt = new \DateTime;

最佳实践(通常)是导入当前文件所需的所有类。use语句非常非常便宜,所以不要退缩。

代码语言:javascript
复制
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

此外,在将名称空间作为字符串传递时,不要忘记使用完全名称空间的类名,尽管您可能位于正确的命名空间中:

代码语言:javascript
复制
namespace foo;

$class = 'foo\bar';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5601123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档