2014-02-11 2 views
0

Я пытаюсь вызвать статический метод, используя строку (тип автоматического eval, который делает интерпретатор).php не удается найти класс по вызову статического метода

Вызов класса на код в буквальном режиме работает отлично. Автозагрузчик разрешает загрузку класса и вызывается метод. Однако, если я использую строку с тем же именем класса и метода, она терпит неудачу.

рабочий пример:

$object = \vendor\package\class::method(); 

не рабочий пример:

$full_method = '\vendor\package\class::method'; 
$object = $full_method(); 

Оба примера правильный код, то первые из них работает отлично. Второй один выдает следующее сообщение об ошибке:

Фатальная ошибка: Вызов неопределенной функции \ поставщика \ пакет \ класс ::() метод в ...

автопогрузчика работает хорошо, даже на втором случае, проверка загруженные классы, файл загружается. Существует ограничение на использование этой «автоматической eval» функциональности, которой я не хватает?

+0

Почему вы кладете в дополнительной переменной? Почему бы не использовать '$ object = \ vendor \ package \ class :: method();' – DanFromGermany

+0

Это приведенный пример. Реальный код загружает строку из ini-файла, мне нужно выбрать метод вне кода (это фабрика). – Diego

ответ

0

Я думаю, вам нужно использовать eval в вашем случае, потому что это сложнее. Вы пытаетесь выполнить метод из класса сразу. Лучше попытаться взорвать их по частям:

$temp = explode('::', $full_method); 
$class = $temp[0]; 
$method = $temp[1]; 

$object = $class::$method(); 
+0

Невероятно, это работает. В середине я нашел другое решение, используя ReflectionMethod. Я отведу еще один ответ. – Diego

0

Это тоже работает:

$stringExploded = explode('::', $classBuilderMethod);    
    $ReflectionMethod = new \ReflectionMethod($stringExploded[0], $stringExploded[1]); 
    $object = $ReflectionMethod->invoke(null); // the parameter is null because the method is static 
Смежные вопросы