如何将PHP闭包(lambda函数)保存到$this->;var,然后从同一类的另一个方法调用它


How to save a PHP closure(lambda function) into $this->var and call it later from another method of the same class?

我有一个类

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()是未定义的方法。但是当我使用调试器时,我发现它是一个闭包对象。如果我将函数保存到一个局部变量(不带$this$someVar)中,并在Init()函数中调用它,它就可以正常工作。但我不想调用那里的函数。我想稍后再打电话。

即使我将它保存到$this->someVar中并在同一范围内调用它,它也不起作用。

也许你应该简单地尝试一下:

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

或者,如果你喜欢的话,这个:

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

尝试

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

这里有其他选项:如何调用作为类变量的闭包?

基本上:

    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);
        }
    }