克隆对象与闭包

时间:2012-04-12 14:25:55

标签: php object closures

我在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”属性。

请建议如何解决此问题。对于包含具有“可调用”属性的类,如何克隆它并使闭包正确引用当前对象。也许我可以遵循不同的模式。谢谢!

2 个答案:

答案 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();
}