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

时间:2012-01-15 22:13:52

标签: php lambda closures

大家好,我想知道如何做到以下几点:

我有一个班级

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 个答案:

答案 0 :(得分:4)

也许你应该试试这个:

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

或者,如果您愿意,可以:

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

答案 1 :(得分:0)

尝试

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

答案 2 :(得分:0)

此处您还有其他选项:How to call a closure that is a class variable?

基本上:

    1. 强制调用__invoke魔法:

      $ myInstance = new MyClass(); $ myInstance->氯氟> __调用();

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