PHP命名空间和导入

时间:2012-07-13 09:51:00

标签: php namespaces

我对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();

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我不确定,但我认为问题在于使用namespace关键字。

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

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

答案 2 :(得分:0)

我的\ Functions \ Printing命名空间看起来像

- 我的\ Functions \ Printing

  • A
输入前的

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

- 我的

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

- 我的

  • A

那么为什么我无法访问我的\ A?

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

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

如果其他类的输入是“创建符号链接”,我必须能够从当前命名空间中获取它。 我们可以从创建它的目录或绝对路径中获取符号链接但是不可能执行导入的类 以其新的道路。 (\我\ A)

为什么?