PHPで日付の操作をおこなうときに利用する便利な Carbon
一般的に利用する date 関数などと違って、クラスなので、インスタンスを参照しているという意識が必要です。
今日から30日間有効なチケットのデータを作りたいとします。
例えばこういうソースコードがあったとします。
$start = new Carbon('2022-09-01 12:34:56');
$end = $start->addDays(30);
$ticket = array(
'start_at' => $start->toString(),
'end_at' => $end->toString(),
);
なんとなく期待するのは、 $start
が 9/1 で、 $end
が 10/1 (9月は30日しかないので、10/1が30日後)だと思います。しかし、このデータは $start
も $end
も 10/1 になります。理由は、$end
には$start
のインスタンスが入っていて、どちらも同じオブジェクトを参照しているためです。
Carbonはミュータブルです。オブジェクトが作成されたあとも状態を変えることができることを意味します。そのため、あとから設定した内容も、前の処理に反映されます。(本当かどうか確かめていないですが、きっとコンパイル時に最終結果を入れているんでしょうね!)
今回やりたいことをするには、 copy()
を利用します。 copy()
は、元のオブジェクトと同じ値の新しいインスタンスを作成します。これで問題解決です。
$start = new Carbon('2022-09-01 12:34:56');
$end = $start->copy()->addDays(30);
$ticket = array(
'start_at' => $start->toString(),
'end_at' => $end->toString(),
);