CarbonはDatetimeを継承しているのでmutableである
PHPの日時ライブラリCarbonのCarbon
クラスは
PHP組み込みのDateTime
クラスを継承している。
従って、フレームワークやライブラリがDateTime
を期待している部分でもCarbon
をそのまま使える。
ドキュメント冒頭にも書いてあるくらいの事実なのだが、何故か忘れがち。
そしてDateTime
同様にmutableなのでCarbon::addDay()
等の操作はもとのインスタンスを直接変更する。
これを忘れて(DateTime
同様に)以下のようなことをやってしまうのは誰もが通る道である。
/**
* 指定日から一週間後までのデータを取得する
*/
function findWeeklyData(Carbon $from)
{
$to = $from->addWeek();
// 意図は「指定日から一週間後まで」だが、$fromも変更されているので
// 実際には「指定日から一週間後のまさにその日だけ」
return $this->findBetween($from, $to);
}
正しくはこうする必要がある。
$to = (clone $from)->addWeek();
// or
$to = $from->copy()->addWeek();
あるいはDateTimeImmutable
を継承するCarbonImmutable
もあるので、そちらを使っても良い。
つくづくDateTime
はデフォルトでimmutableであってほしかったことだなあ。