CarbonはDatetimeを継承しているのでmutableである

PHPの日時ライブラリCarbonCarbonクラスは
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であってほしかったことだなあ。