Почему возвращение этого пространства имен \ class вызывает ошибку?

У меня проблемы с динамическим вызовом класса в одном и том же пространстве имен.

Чтобы упростить мою систему:

У меня есть эта структура пространства имен:

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 с динамическим именем класса но я не вижу разницы?

0

Решение

Как оператор разрешения области видимости (::) имеет более высокий приоритет, чем конкатенация (.) ваш прямой звонок '\\' . __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(),

1

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

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

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