Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP名称空间:\My\Namespace还是My\Namespace? My\Namespace \My\Namespace_Php_Namespaces_Php 5.3 - Fatal编程技术网

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年…晚回复仍然是回复:)