2013-05-30 6 views
1

Я хочу получить статический метод из класса и скопировать его в переменную.Преобразование статического метода в лямбда в PHP

Это нерабочим пример, иллюстрирующий мой вопрос:

class foo 
{ 
    public static function bar($argument){ return 2*$argument; } 
} 

$class = new ReflectionClass('foo'); 
// here is no ReflectionMethod::getClosure() method in reality 
$lambda = $class->getMethod('bar')->getClosure(); 

echo $lambda(3); 

Так что мой вопрос: возможно ли это каким-либо обычным способом? На данный момент я нахожу только один способ. Я могу проанализировать исходный файл, получить из него источник метода и преобразовать его с помощью create_function(), но он слишком извращен.

+0

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

+0

Я не понимаю цели, но как насчет создания функции лямбды в качестве оболочки для 'Foo :: бар() '? – arkascha

+1

Подумав некоторое время, я смею сказать, что невозможно превратить метод класса в лямбда-функцию. Это не имеет смысла, если бы это было возможно (или есть, мы говорим о php со всеми его проблемами здесь ...), тогда все может действительно сломаться. Причина в том, что метод класса может не быть независимым: он может относиться к другим методам или членам класса. Без этих присутствий функция lamba определенно не имела бы никакого смысла ... – arkascha

ответ

0

Просто оберните его закрытием.

$lamda = function($argument){return foo::bar($argument);}; 

Или вы можете попробовать использовать что-то вроде этого

function staticMethodToClosure($class, $method) { 
    return function($argument)use($class, $method){return $class::$method($argument);}; 
} 
+0

См. Мой предыдущий комментарий выше ... Однако я думаю, что OP хочет быть независимым от определения класса. – arkascha

+0

@arkascha, новый функция там. – sectus

+0

Что это значит для разницы? Вам все еще нужно определение класса. Ничего не изменилось, за исключением того, что вы разрешаете указывать имя класса и метода. Большая сделка. – arkascha

0

Массив в формате array($className, $methodName) является invokable как статический вызов метода, так это может работать для вас.

class foo 
{ 
    public static function bar($argument){ return 2*$argument; } 
    public static function getStaticFunction($arg){ 
     return array("foo", $arg); 
    } 
} 

$a = foo::getStaticFunction("bar"); 
echo $a(5); // echos 10 
Смежные вопросы