У меня проблемы с динамическим вызовом класса в одном и том же пространстве имен.
Чтобы упростить мою систему:
У меня есть эта структура пространства имен:
core
core\classes
В core\classes
Есть два класса (в двух файлах, оба были включены ранее):
class AUTO_LOAD
{
public function regSingleton($event)
{
$temp_event = $event;
//$event = '_' . $event;
//global $$event;
//$$event = $temp_event::newInst(); // the old version without namespaces - this worked
HELPER::varDump(SYSTEM::newInst()); // this works
HELPER::varDump($temp_event::newInst()); // this doesn't work
exit;
}
}
а также
class SYSTEM
{
// Some code;
}
Затем создать экземпляр AUTO_LOAD
:
$_AUTO_LOAD = new AUTO_LOAD;
$_AUTO_LOAD->regSingleton('SYSTEM');
Выход:
объект (core \ classes \ SYSTEM) # 2 (3) {}
Неустранимая ошибка: класс ‘SYSTEM’ не найден в
… / система / включает / классы / class.autoload.php
Как вы можете видеть выше, если я попытаюсь позвонить SYSTEM::newInst()
(статически) это работает, но если я пытаюсь запустить его динамически ($temp_event::newInst()
) это не так.
Ни прямой звонок через '\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
ни через '\\core\classes\\' . $temp_event::newInst();
работает (тот же вывод).
Где ошибка (в рассуждениях)? Спасибо за любую помощь заранее!
PS: я уже читал Пространство имен PHP с динамическим именем класса но я не вижу разницы?
Как оператор разрешения области видимости (::
) имеет более высокий приоритет, чем конкатенация (.
) ваш прямой звонок '\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
будет оцениваться как ('\core\classes\') . ('SYSTEM'::newInst())
и, следовательно, не будет работать.
Попробуйте изменить свой код на это:
$temp_event = __NAMESPACE__ . '\\' . $event;
Это будет иметь $temp_event
включить пространство имен и $temp_event::newInst()
будет оцениваться как 'core\classes\SYSTEM'::newInst()
т.е. core\classes\SYSTEM::newInst()
,
Других решений пока нет …