Как сохранить закрытие PHP (лямбда-функцию) в $ this-> var и вызвать его позже из другого метода того же класса? - PullRequest
3 голосов
/ 16 января 2012

Привет, ребята, мне интересно, как сделать следующее:

У меня есть класс

class SomeClass {
  private $someVar;

  public function Init($func) {
    $this->someVar = $func;
  }

  public function DoSomething() {
    $this->someVar("asdasdasd");
  }
}

$obj = new SomeClass();
$obj->Init(function ($param){var_dump($param);});
$obj->DoSomething();

И когда я вызываю метод DoSomething, я получаю сообщение о том, что SomeClass::someVar() - неопределенный метод. Но когда я использую отладчик, я вижу, что это объект замыкания. Если я сохраню функцию в локальной переменной ($someVar без $this) и вызову ее в функции Init(), она будет работать нормально. Но я не хочу вызывать функцию там. Я хочу позвонить позже.

Даже если я сохраню его в $this->someVar и назову его в том же объеме, он не будет работать.

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Может быть, вы просто должны попробовать это:

public function DoSomething()
{
  $tmpVar = $this->someVar;
  $tmpVar("asdasdasd");
}

или, если хотите, это:

public function DoSomething()
{
  call_user_func($this->someVar, "asdasdasd");
}
0 голосов
/ 24 января 2014

Здесь у вас есть другие варианты: Как вызвать замыкание, являющееся переменной класса?

В основном:

    1. Принудительный вызов магического метода __invoke:

      $ myInstance = new MyClass ();$ myInstance-> lambda -> __ invoke ();

  • или 2. Захватить вызов метода:

    class MyClass
    {
        private $lambda;
    
        public function __construct()
        {
            $this->lambda = function() {
                echo "Hello world!\n";
            };
        }
    
        public function __call($name, $args)
        {
            return call_user_func_array($this->$name, $args);
        }
    }
    
0 голосов
/ 16 января 2012

Попробуйте

public function DoSomething()
{
    call_user_func( $this->someVar, 'test');
}
...