1

我在 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。我理解它为什么会发生,因为我已经分配了一个局部变量,该变量嵌入到我的闭包的定义中,随后嵌入到“钩子”属性中。

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

4

2 回答 2

2

$hook您可以在克隆时简单地覆盖:

public function __clone() {
    $this->setHook();
}

不确定您的示例是否代表您的实际代码。我希望它有所帮助。

在 PHP 5.4 中,您可以直接在闭包中使用Closure::bindToand :$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);
    }
}
于 2012-04-12T16:19:08.267 回答
0

我认为最简单的方法是自我封装

private function getA() { return $this->a;}

$this->hook=function(){
        echo $this->getA();
}
于 2012-04-12T14:27:04.930 回答