事象
- Carbonクラスのインスタンスを操作すると、元のインスタンスの値が変わる
// 現在年月日が2022-01-01だとする
//インスタンス作成
$now = Carbon::now();
var_dump($now->format('Y-m-d')) // 2022-01-01
// 一日加える
$addOneDay = $now->add(1, 'day');
// 結果
var_dump($now->format('Y-m-d')) // 2022-01-02 ← 注目!!
var_dump($addOneDay->format('Y-m-d')) // 2022-01-02
原因
- CarbonクラスのインスタンスはMutable(可変)だから
解決策
- copy()を使用する
// 現在年月日が2022-01-01だとする
//インスタンス作成
$now = Carbon::now();
var_dump($now->format('Y-m-d')) // 2022-01-01
// 一日加える
$addOneDay = $now->copy()->add(1, 'day'); ← 注目!!
// 結果
var_dump($now->format('Y-m-d')) // 2022-01-01 ← 期待通り
var_dump($addOneDay->format('Y-m-d')) // 2022-01-02
- Immutableにする
// 現在年月日が2022-01-01だとする
//インスタンス作成
$now = Carbon::now();
var_dump($now->format('Y-m-d')) // 2022-01-01
// CarbonImmutableクラスに変換
$now->toImmutable(); ← 注目!!
// 一日加える
$addOneDay = $now->add(1, 'day');
// 結果
var_dump($now->format('Y-m-d')) // 2022-01-01 ← 期待通り
var_dump($addOneDay->format('Y-m-d')) // 2022-01-02