長い間やりたいことを台無しにしてきた問題があります。これは、PHPでの魔法のgetとsetの使用、およびオブジェクトに対して事前インクリメントを実行しようとすることに関連しています。私は次のようなPHPクラスを持っています:
class Foo {
public $object;
function __construct() {
$this->object = array("bar" => 1);
}
function & __get($name) {
return $this->object[$name];
}
function __set($name, $value) {
echo "Old value: ". $this->object[$name] ." - New value: ". $value ."\n";
$this->object[$name] = $value;
}
}
メソッドのに注意してください&
。__get
今、私はこのコードを実行します:
$o = new Foo();
echo "First test\n";
$o->bar = 2;
echo "Second test\n";
$o->bar = $o->bar + 1;
echo "Third test\n";
$o->bar += 1;
echo "Fourth test\n";
++$o->bar;
そして、出力は次のとおりです。
First test
Old value: 1 - New value: 2
Second test
Old value: 2 - New value: 3
Third test
Old value: 4 - New value: 4
Fourth test
Old value: 5 - New value: 5
3番目と4番目のテストには、予期しない(私による)動作があります。$ this-> object ['bar']は、予想どおりの古い値ではなく、設定する値を返すように見えます。実際に設定される前に、なぜ値がすでに設定されているのですか?
&
メソッドからを削除する__get
と、これは機能するので、PHPが行う参照管理と関係があると思います。しかし、3番目のテストは2番目のテストと同じように動作することを期待しますが、そうではありません。
私は本当にこれを理解していません。どんな助けでも大歓迎です。