我有一个类
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');
}
这里有其他选项:如何调用作为类变量的闭包?
基本上:
-
-
强制调用
__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); } }