オブジェクトのコピーはできない?
$item = new Item(); $item->value = 1; // コピー? $item2 = $item; $item2->value = 2;
この時、$itemと$item2の値はどうなるでしょう?
実は両方一緒
// 2 $item->value; // 2 $item2->value;
あれ?なんで?
インスタンスの変数のコピーは、実際は参照を渡しているだけ
// コピー? $item2 = $item;
ここが問題。
この$itemの中には、インスタンスの『参照』を持っている。
つまり、 new Item();
の保存先。実際の値は違いますが、
0x4842ffaa
みたいに、住所が保存されています。
だから、住所をコピーしたところで、住所の先の家が変わるわけではないので、
$itemと$item2の中身は実質一緒ってことになります。
だから、 $item2->value = 2;
で、$itemも$item2も両方書き換わったわけですね。
じゃあどうするの?
$item2 = clone $item;
これでOK。 clone $item
で、同じ内容で、新しいオブジェクトを作ってくれる。
その参照先を$item2に保存するので、$itemと$item2は異なる値になる。
こういう時に、cloneを使うんですね。