2016-06-02 6 views
1

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

я иметь следующую структуру:

класс 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, все ссылающиеся друг на друга без квалификатора пространства имен - и было бы довольно болезненно (но не невозможно) пойти изменить их все.

+0

В вашем примере класс 'Z' на самом деле называется' Y'. Я проверил ваш образец (с фиксированным классом Z) и, похоже, отлично работает с базовой функцией автозагрузки: – Pieter

+0

@Pieter Да, это должно быть Z, копировать/вставлять ошибку. Тогда почему в автозагрузчике (и я признаю, что это настраиваемый автозагрузчик для решения проблем, связанных с проектом), имя запрашиваемого класса не имеет пространства имен? –

+0

Без предоставления фактического кода автозагрузчика я не могу сказать вам. С этим автозагрузчиком он работает: 'spl_autoload_register (function ($ class) {require_once __DIR__. '/'. Str_replace ('\\', '/', $ class). '.php';});' (предполагая, что вы используйте PSR-0 с вашей структурой проекта). – Pieter

ответ

0

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

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

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

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

И это отлично работало.

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