♻️

PHPでのcloneの使い所

2023/08/31に公開

概要

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を使ってみましょう。

参照

https://tadtadya.com/php-object-cloning/

https://qiita.com/asagi_00a3af/items/45e1470e7745de227f2f

https://zenn.dev/stnr_kai/articles/118715ed72e53c

Discussion