与调用者在同一名称空间中的类的类未找到错误

时间:2016-06-02 11:01:24

标签: php namespaces autoload

我对此感到有点困惑,因为它必须非常简单。

我有以下结构:

X类:

namespace A;
use \B\Y;

class X
{
    public function __construct()
    {
        $y = new Y();
    }
}

Y级:

namespace B;

class Y
{
    public function __construct()
    {
        $z = new Z();
    }
}

Z级:

namespace B;

class Z
{
    public function __construct()
    {
        ...
    }
}

主程序:

namespace A;

$x = new X();

如您所见,类Y和Z位于同一名称空间中,而A类位于不同的名称空间中(与主程序相同)

当我尝试执行此主程序时,收到错误消息PHP Fatal error: Class 'Z' not found

如果我调试程序并在自动加载器中放置一个断点,我可以看到类Y正在加载为\ B \ Y,但是正在加载类Z而没有使用名称空间限定符(它正被使用)在同一名称空间的另一个类中)。问题是,为什么在没有命名空间限定符的情况下加载类Z?

我在命名空间B中有很多类,所有类都没有命名空间限定符而相互引用 - 而且要更改它们将会非常痛苦(但并非不可能)。

1 个答案:

答案 0 :(得分:0)

非常有趣。我发现的是这个。在我的例子中,类的名称是从外部源读取的,如下所示:

$className = "Segment_" . $element->getName();
$segment = new $className();

这失败了,抱怨找不到类,并且在通过自动加载器时,显示被请求的类不包含命名空间。我将此代码更改为此代码:

$className = __NAMESPACE__ . "\Segment_" . $element->getName();
$segment = new $className();

这很好。

我认为,对于动态类名,PHP不是在当前命名空间的前面,而是必须手动添加。