次のプログラムを見てみましょう。
<?php
class Item {
public string $name;
}
$item01 = new Item();
$item01->name = 'PHP入門';
ここで、同じ「Item」というクラスのインスタンスをさらに作りたいとします。この時、すでに作った「$item01」を代入してしまうと、おかしなことが起こります。
$item02 = $item01; // $item01を代入して $item02を作成
ここで、$item01のプロパティを加工すると、$item02の方も変わってしまいます。
$item01->name = 'JS入門';
echo $item02->name; // 操作していない $item02のプロパティの内容が変わってしまう
これは、インスタンスが複製しているのではなく元のインスタンスを参照しているために起こります。これを防ぐには「clone」ファンクションを利用します。
インスタンスを複製する
次のように変更しましょう。
$item02 = clone($item01); // クローンを作成
$item01->name = 'JS入門';
echo $item02->name; // クローンすれば内容が変わらない
こうして利用できます。
完成プログラム
<?php
class Item {
public string $name;
}
$item01 = new Item();
$item01->name = 'PHP入門';
$item02 = clone($item01);
$item01->name = 'Python入門';
echo $item02->name;