我在PHP5.3中有以下类:
class MyClass {
public $a=1;
public $hook;
function setHook(){
$t=$this;
$this->hook=function() use($t){
echo $t->a;
};
}
}
以下语法按预期工作:
$x = new MyClass();
$x->setHook();
call_user_func($x->hook); // outputs 1;
但是,如果我继续使用此代码:
$y = clone $x;
$y->a = 2;
call_user_func($y->hook);
然后它仍然会输出1.我理解为什么会发生这种情况,因为我已经分配了一个局部变量,它嵌入到我的闭包的定义中,然后进入“hook”属性。
请建议如何解决此问题。对于包含具有“可调用”属性的类,如何克隆它并使闭包正确引用当前对象。也许我可以遵循不同的模式。谢谢!
答案 0 :(得分:2)
您可以在克隆时简单地覆盖$hook
:
public function __clone() {
$this->setHook();
}
不确定您的示例是否代表您的实际代码。我希望它有所帮助。
在PHP 5.4中,您可以直接在闭包中使用Closure::bindTo
和$this
:
class MyClass {
public $a = 1;
public $hook;
public function setHook(){
$this->hook=function() {
echo $this->a;
};
}
public function __clone() {
$this->hook = $this->hook->bindTo($this);
}
}
答案 1 :(得分:0)
我认为最简单的方法是self-encapsulation:
private function getA() { return $this->a;}
$this->hook=function(){
echo $this->getA();
}