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であってほしかったことだなあ。