Вызов метода (хранится в переменной) в замыкании

0

Я пытаюсь найти способ сделать пример 2, если это возможно. Кто-нибудь даст мне руку, пожалуйста?

ВЫЗОВ

$this->getValue('getName');
$this->getValue('getEmail');

ПРИМЕР 1 (РАБОТЫ)

private function getValue($method)
{
    $o = new Order();
    $p = $o->Payment();

    return $p->$method();                 // Works
    return  $p->call_user_func($method);  // Works
}

ПРИМЕР 2 (НЕ РАБОТАЕТ)

private function getValue($method)
{
    return
        new Closure(function (Order $o) {
            if ($o->getPayment() instanceof Payment) {
                 return $o->Payment()->$method();                 // Don't Work
                 return $o->Payment()->call_user_func($method);   // Don't Work
            }
        });
}
  • 0
    В чем разница между $o->getPayment() и $o->Payment() ?
  • 0
    Нет разницы, но это может быть удалено позже, так что пока не проблема.
Показать ещё 1 комментарий
Теги:
closures

2 ответа

1
Лучший ответ
class Test {
    public function abc(){
       echo "ok";
    }
}


function getValue($method){
    return (function($o) use ($method) {
        if ($o instanceof Test) {
            return $o->$method();
        }
    });
}

$m = getValue('abc');
$m(new Test());
  • 0
    use ($method) отсортировал это. Спасибо
0

$o не определено, я думаю, и, вероятно, вы получили это сообщение об ошибке:

Parse error: parse error, expecting ''&'' or 'T_VARIABLE'


это должно работать:

private function getValue($method)
{
    return
        new Closure(function () {
            $o = new Order();
            return $o->Payment()->$method();
        });
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню