大家好,我想知道如何做到以下几点:
我有一个班级
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
并在同一范围内调用它也不起作用。
答案 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?
基本上:
强制调用__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);
}
}