Я немного смущен этим, потому что это должно быть что-то чрезвычайно простое.
У меня есть следующая структура:
класс 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, все ссылаются друг на друга без квалификатора пространства имен — и было бы довольно болезненно (но не невозможно) изменить их все.
Очень интересно на самом деле. Я нашел это. В моем случае имя класса читается из внешнего источника, примерно так:
$className = "Segment_" . $element->getName();
$segment = new $className();
Это не удалось, так как жалоба на то, что класс не был найден, и, когда он прошел через автозагрузчик, показала, что запрашиваемый класс не содержит пространства имен. Я изменил этот код на этот:
$className = __NAMESPACE__ . "\Segment_" . $element->getName();
$segment = new $className();
И это работало нормально.
Я предполагал, что для динамических имен классов PHP не предшествует текущему пространству имен, и его нужно было добавлять вручную.
Других решений пока нет …