0

我对 PHP 中的命名空间有疑问。

此代码不起作用:

<?php
namespace My\Functions\Printing;

class A {
    public function __construct() {
        echo __NAMESPACE__;
    }
}


namespace My;
use My\Functions\Printing\A as A;


$obj=new namespace\A();

但这一项工作:

<?php
namespace My\Functions\Printing;

class A {
    public function __construct() {
        echo __NAMESPACE__;
    }
}


namespace My;
use My\Functions\Printing\A as A;


$obj=new A();

我想获得有关命名空间导入行为的更多信息。为什么导入的类在导入的命名空间中无法访问?

4

3 回答 3

1

可能您对使用“使用”有一个困惑的想法。关键字 'namespace' 指的是当前的命名空间

namespace My\Functions\Printing;

class A {
    public function __construct() {
        echo __NAMESPACE__;
    }
}

namespace My;
use My\Functions\Printing\A;
use My\Functions\Printing\A as myAlias;

$obj=new namespace\A(); // instance of  \My\A (doesn't exist)
$obj2=new A(); // instance of  \My\Functions\Printing\A
$obj3=new myAlias(); // instance of  \My\Functions\Printing\A

像往常一样,请参阅文档以获取完整的详细信息:php doc

于 2012-07-13T10:31:54.963 回答
0

My\Functions\Printing 命名空间看起来像

-- 我的\功能\打印

  • 一个

导入前的“我的”命名空间如下所示:

- 我的

导入后的“我的”命名空间应该看起来像(我认为)

- 我的

  • 一个

那么为什么我不能访问 My\A ?

我认为命名空间的结构并没有改变 PHP 编译器在“命名空间结构”之前的“命名空间导入区”中检查。

文档指定名称空间看起来像文件系统,这是错误的。

如果其他类的导入是“创建符号链接”,我必须能够从当前命名空间访问它。我们可以从创建它的目录或从绝对路径访问符号链接,但无法使用新路径访问导入的类。(\我的\A)

为什么 ?

于 2012-07-13T15:58:26.793 回答
0

我不确定,但我认为问题在于使用命名空间关键字。

http://www.php.net/manual/pl/language.namespaces.nsconstants.php

在第一个示例中,您位于我的命名空间中,所以namespace\A()==My\My\Functions\Printing\A()

于 2012-07-13T10:11:52.263 回答