PHP: DateTimeオブジェクトのコピー

Pocket

ある時点から1日前までのデータを処理したいときには、基準となる日時とその1日前の日時、2つの値を変数が必要だ。

PHP5ではDateTimeオブジェクトのコピーをするにはcloneを使う。


$now   = new DateTime; // 現在日時
$clone = clone $now; // 現在日時をディープコピー
$clone->modify( '-1 day' ); // 1日引く
    
echo $now->format( 'Y-m-d' ) . " <-> " . $clone->format( 'Y-m-d' );
// 2016-12-15 <-> 2016-12-14

cloneしないでただ代入すると、2つの変数は繋がったままとなる。
(PHP4まではこの方法でオブジェクトをコピーできていたが、PHP5ではオブジェクトのコピー方法が変わった。)


$now   = new DateTime;
$clone = $now; // 代入
$clone->modify( '-1 day' );

echo $now->format( 'Y-m-d' ) . " <-> " . $clone->format( 'Y-m-d' );
// 2016-12-14 <-> 2016-12-14

参考

オブジェクトのクローン作成

オブジェクトのクローンが作成される際、PHP 5 は、そのオブジェクトのプロパティを 全てシャローコピーします。他の変数へのリファレンスを保持する全てのプロパティは、 リファレンスのままとなります。

[PHPプロ!] PHPでの内部変数の扱われ方 – PHP5のオブジェクトコピーでありがちな勘違い

 オブジェクト指向で作られたアプリケーションをPHP4からPHP5への移行した経験のある人によく見受けられるのですが、PHP5ではデフォルトでオブジェクトのコピーは参照のコピーとなる、というのは間違いです。確かにオブジェクトは「参照のように」扱うことができますが、正確にはオブジェクトへの参照ではありません。よく似た動きをするので大変間違いやすいのです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です