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 没有添加到当前命名空间之前,必须手动添加。
我对此有点困惑,因为它必须非常简单。
我有以下结构:
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 没有添加到当前命名空间之前,必须手动添加。