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が出力されます。クロージャの定義に埋め込まれ、続いて「フック」プロパティに埋め込まれたローカル変数を割り当てたため、なぜ発生するのか理解できます。
この問題を回避する方法を提案してください。「呼び出し可能」なプロパティを含むクラスの場合、それをクローン化し、クロージャが現在のオブジェクトを適切に参照するようにするにはどうすればよいですか。おそらく私は別のパターンに従うことができます。ありがとう!