我对此感到有点困惑,因为它必须非常简单。
我有以下结构:
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中有很多类,所有类都没有命名空间限定符而相互引用 - 而且要更改它们将会非常痛苦(但并非不可能)。
答案 0 :(得分:0)
非常有趣。我发现的是这个。在我的例子中,类的名称是从外部源读取的,如下所示:
$className = "Segment_" . $element->getName();
$segment = new $className();
这失败了,抱怨找不到类,并且在通过自动加载器时,显示被请求的类不包含命名空间。我将此代码更改为此代码:
$className = __NAMESPACE__ . "\Segment_" . $element->getName();
$segment = new $className();
这很好。
我认为,对于动态类名,PHP不是在当前命名空间的前面,而是必须手动添加。