Class 在与调用方相同的命名空间中找不到 class 错误

Class not found error for a class in the same namespace as the caller

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

我有以下结构:

class X:

namespace A;
use \B\Y;

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

class Y:

namespace B;

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

class Z:

namespace B;

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

主程序:

namespace A;

$x = new X();

可以看到,class是Y和Z在同一个命名空间,而classA在不同的命名空间(和主程序一样)

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

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

我在命名空间 B 中有很多 class,它们在没有命名空间限定符的情况下相互引用 - 将它们全部更改会非常痛苦(但并非不可能)。

确实很有趣。我发现的是这个。在我的例子中,class 的名称是从外部来源读取的,如下所示:

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

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

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

这很好用。

我想,对于动态的 class 名称,PHP 没有添加到当前命名空间之前,必须手动添加。