Класс не найден ошибка для класса в том же пространстве имен, что и вызывающий

Я немного смущен этим, потому что это должно быть что-то чрезвычайно простое.

У меня есть следующая структура:

класс 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

Решение

Очень интересно на самом деле. Я нашел это. В моем случае имя класса читается из внешнего источника, примерно так:

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

Это не удалось, так как жалоба на то, что класс не был найден, и, когда он прошел через автозагрузчик, показала, что запрашиваемый класс не содержит пространства имен. Я изменил этот код на этот:

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

И это работало нормально.

Я предполагал, что для динамических имен классов PHP не предшествует текущему пространству имен, и его нужно было добавлять вручную.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]