PHPには、クローン(clone)という仕組みがあります。この仕組みを使うとインスタンスのコピーを作成することができます。
この記事を理解すると、PHPのcloneの使い方、cloneの仕組み、cloneの使い所が分かります。
cloneの使い方
早速cloneの使い方を見てましょう。
<?php
$now = new DateTime();
$tomorrow = clone $now;
$tomorrow->modify("+1 day");
echo $now->format("Y-m-d") . "\n";
echo $tomorrow->format("Y-m-d") . "\n";
?>
実行すると、この結果となりました
2025-01-18
2025-01-19
$nowが1/18
$tomorrowが1/19として意図した通りにcloneが作成されました。
PHPのcloneは、ディープコピーを作成するということになります。
cloneの仕組み
次は、cloneの仕組みを理解するために、cloneを使わない場合の失敗例を見てみます。
<?php
$now = new DateTime();
$tomorrow = $now;
$tomorrow->modify("+1 day");
echo $now->format("Y-m-d") . "\n";
echo $tomorrow->format("Y-m-d") . "\n";
?>
実行すると、この結果となりました
2025-01-19
2025-01-19
modifyを使って1日後を$tomorrowに設定していますが、$nowの変数まで1日後になっています。
インスタンスの代入は、cloneを使わない場合、元になるインスタンスへの参照となってしまうということが分かりました。
単純に代入では、インスタンスのコピーは作成されない。
この動きをシャローコピーと呼び、コピーがコピー元のオブジェクトを参照します。
インスタンスをコピーして、別のインスタンスを作成したい場合は、cloneを使って別のインスタンスを作らないといけないですね。
まとめ
いかがでしょうか?cloneの仕組み、使い方、使いどころが理解できましたか?
今回のサンプルのソースのように、日付のcloneを作成したいケースはあるかもしれないですね。
<?php
$now = new DateTime();
$tomorrow = $now;
$tomorrow->modify("+1 month");
if ($now <= $date && $date < $tomorrow) {
echo "date変数は、今日から一ヶ月以内の日付です";
}
?>
こんな使い方ができますね。
個人的には、ほとんど使ったことがありません。いつかcloneを使っているソースを読むことがあるかもしれないので、PHPにはそんな仕組みがあったなと思い出してください。