エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】cloneを使う時って?オブジェクトはそのままコピーできない?【267日目】

オブジェクトのコピーはできない?

$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を使うんですね。

参照先

PHP: オブジェクトのクローン作成 - Manual