ある時点から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ではデフォルトでオブジェクトのコピーは参照のコピーとなる、というのは間違いです。確かにオブジェクトは「参照のように」扱うことができますが、正確にはオブジェクトへの参照ではありません。よく似た動きをするので大変間違いやすいのです。