2012-05-10 4 views
4

Я разрабатываю Symfony2, и мне нужно вызвать метод в классе, который известен только во время выполнения.PHP call_user_func по статическому методу

я уже успешно используется variable functions и call_user_func в проекте, но на этот раз они дают мне проблемы ...

Мой код выглядит следующим образом

namespace MyBundleNamespace; 

use MyBundle\Some\Class; 

class MyClass 
{ 
    public static function myFunction() { ... } 
} 

и в какой-то другой файл мне нужно делают это

MyClass::myFunction(); 

но динамически, поэтому я попытался как

$class = "MyClass"; 
$method = "myFunction"; 

$class::$method(); 

и

$class = "MyClass"; 
$method = "myFunction"; 
call_user_func("$class::$method"); 

Но я получаю ошибку class MyClass not found. Конечно, класс включен правильно с use, и если я звоню MyClass::myFunction(), то он так же работает.

Я также попытался запустить автозагрузчик вручную, как это было предложено в комментарии this question, но это не сработало. Также class_existsfalse.

Что мне не хватает? Есть идеи?

Спасибо!

+1

вы пробовали 'call_user_func (массив ($ класс, $) метод)'? – prehfeldt

+0

Да, я сделал, результат был таким же. – mokagio

ответ

13

Вы упускаете имена:

$class = '\\MyBundleNamespace\\MyClass'; 
$method = 'myFunction'; 

Оба вызова должен работать:

call_user_func("$class::$method"); 
call_user_func(array($class, $method)); 
+0

Да, это сработало! Я предпочитаю путь переменной функции, поэтому я использовал: '$ namespace =" MyNamespace "; $ class = "$ namespace \\ MyClass"; $ method = "myMethod"; $ class :: $ myMethod(); ' – mokagio

+0

Не могли бы вы рассказать мне, почему мне пришлось добавить пространство имен? Связано ли это с тем, что все это оценивается временем выполнения? – mokagio

+0

Несомненно. Если вы не укажете пространство имен (или импортируете его с помощью «use»), то используется текущий. –