♻️
PHPでのcloneの使い所
概要
PHPでのcloneの使い所の理解が浅かったのでまとめてみました。
オブジェクトを代入でコピーしてみた
<?php
class Animal {
public string $type;
}
$animal1 = new Animal();
$animal1->type = "dog";
$animal2 = $animal1;
$animal2->type = "cat";
この時animal1とanimal2の値はどうなるか?
結果を見てみるとどちらもtypeがcatになってる....
代入元のanimal1のtypeはdogのままでいてほしかった..
var_dump($animal1->type);
→ "cat"
var_dump($animal2->type);
→ "cat"
何故?
objectは参照型なのでobjectを普通に代入しようとすると、
代入先(animal2)の変更が代入元(animal1)にも作用してしまうため。
※この様なオブジェクトの代入(=)は厳密なコピーではなくシャローコピーと呼ぶ
代入元に影響がないようにする方法
cloneを使う
<?php
class Animal {
public string $type;
}
$animal1 = new Animal();
$animal1->type = "dog";
$animal2 = clone $animal1;
$animal2->type = "cat";
結果を見てみると、今回は大丈夫そう。
var_dump($animal1->type);
→ "dog"
var_dump($animal2->type);
→ "cat"
clone $animal1
をすることで同じ内容で、新しいオブジェクトを作ってくれます。
代入先(animal2)の変更が代入元(animal1)には作用されなくなりました。
まとめ
代入元に影響がないようにしたい時はcloneを使ってみましょう。
参照
Discussion