🐈

CarbonとCarbonImmutableの違い

2023/11/12に公開

はじめに

日時ライブラリのCarbonとCarbonImmutableに関してどこの部分が違うのか気になったので、実際に調べてみました。

Carbonとは

日時ライブラリです。DataTimeクラスを継承しています。Carbonに対して変更をすると、同じインスタンスが変更され返されるので、意図しない動作がおき、バグの原因になったりするので注意が必要です。
例えば、以下のように記述した時

<?php 
use Carbon\Carbon;

$now = Carbon::now();
$tomorrow = $now->addDay();
echo $now // 2023-11-10 23:49:14
echo $tomorrow // 2023-11-10 23:49:14

addDayメソッドによって日にちを追加した場合に元のインスタンスも変更されてしまっています。

$tomorrow = $now->copy()->addDay();

上記のようにcopyメソッドを使用すれば、元のインスタンスが変更されませんが、すべての処理に記述しないといけないのと、記述漏れの可能性があるのであまり良くありません。

CarbonImmutableとは

Carbonのイミュータブル版です。こちらは DateTimeImmutableクラスを拡張しています。同じメソッドを使用した場合、新しい値をもつ新しいインスタンスが返されるので、元のインスタンスには影響がありません。

<?php 
use Carbon\CarbonImmutable;

$now = CarbonImmutable::now();
$tomorrow = $now->addDay();
echo $now // 2023-11-10 00:40:00 
echo $tomorrow // 2023-11-11 00:40:00

addDayメソッドによって日にちを追加した場合に元のインスタンスに影響はありません。

おわりに

今回はCarbonとCarbonImmutableの違いに関して簡単にまとめました。特別な理由がない限りはCarbonImmutableを使うのがいいような気がします。他にも学習したことに関してまとめていきたいと思います。最後まで読んでいただきありがとうございました。

参考文献

https://carbon.nesbot.com/docs/

Discussion