Я немного смущен, так как это должно быть чем-то чрезвычайно простым.Класс не найден ошибка для класса в том же пространстве имен, что и вызывающий
я иметь следующую структуру:
класс 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 находятся в том же пространстве имен, в то время как класс А в другом пространстве имен (который так же, как основная программа)
Когда я пытаюсь выполнить эту основную программу, я получаю сообщение об ошибке PHP Fatal error: Class 'Z' not found
.
Если я отлаживаю программу и устанавливаю точку останова внутри автозагрузчика, я вижу, что класс Y загружается как \ B \ Y, но класс Z загружается без квалификатора пространства имен (он используется внутри другого класса из того же пространства имен). Вопрос в том, почему класс Z загружается без квалификатора пространства имен?
У меня есть довольно много классов в пространстве имен B, все ссылающиеся друг на друга без квалификатора пространства имен - и было бы довольно болезненно (но не невозможно) пойти изменить их все.
В вашем примере класс 'Z' на самом деле называется' Y'. Я проверил ваш образец (с фиксированным классом Z) и, похоже, отлично работает с базовой функцией автозагрузки: – Pieter
@Pieter Да, это должно быть Z, копировать/вставлять ошибку. Тогда почему в автозагрузчике (и я признаю, что это настраиваемый автозагрузчик для решения проблем, связанных с проектом), имя запрашиваемого класса не имеет пространства имен? –
Без предоставления фактического кода автозагрузчика я не могу сказать вам. С этим автозагрузчиком он работает: 'spl_autoload_register (function ($ class) {require_once __DIR__. '/'. Str_replace ('\\', '/', $ class). '.php';});' (предполагая, что вы используйте PSR-0 с вашей структурой проекта). – Pieter