これまでQiita上ではあまり触れられてないようですが、Laravel5.8であの忌まわしきCarbonのmutableな挙動に悩まされることから脱却できるようになったみたいです(悩んでたのは俺だけか… 何かしらwrapして使ってるだろうし)。
Carbon Updates Coming to Laravel 5.8
https://laravel-news.com/carbon-2-laravel
ほえー、Carbon2ですか。
一時期は**「Chronosに乗り換えよう!」**みたいな話もよく出てましたが、やっぱり標準で使われているものを使える安心感ってのはありますよね。
とりあえず簡単な動作確認をLaravel5.8上にて行いました。
以下のソースコードは必要なところのみで適当に端折ってます。
//CarbonImmutableという名前になっていますが馴染みのあるCarbonに変えとく
use Carbon\CarbonImmutable as Carbon;
//テストのために日付をセット
Carbon::setTestNow('2019-04-01 10:00:00');
//まずはImmutableのテスト
$now = Carbon::now();
$tomorrow = $now->addDay();
echo($now->format('Y-m-d h:i:s'));//2019-04-01 10:004:00(←変わってなくてなんとなく直感的だ!)
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-02 10:00:00
//toMutable()メソッドで途中からMutableにも変更できる
$now = $now->toMutable();//代入せずに$now->toMutable()だけだと意味がないようだ(当たり前?)
$tomorrow = $now->addDay();
echo($now->format('Y-m-d h:i:s'));//2019-04-02 10:00:00(←今まで通りのMutableの挙動)
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-02 10:00:00
//toImmutable()メソッドで途中からImmutableにも変更できる
$now = $now->toImmutable();//これも代入せずに$now->toMutable()だけだと意味がないようだ(Mutableな挙動の対象って時間だけだったのか?)
$tomorrow = $now->addDay();
echo($now->format('Y-m-d h:i:s'));//2019-04-02 10:00:00(←変わってない)
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-03 10:00:00
ということでした。途中でMutableに変えたりとかあまりしないでしょうけど…
Carbon2への移行にともない細かいところででもろもろ挙動が変わっているところもあるようで、既存のプロジェクトを変更する場合は要注意の模様です。詳しくは以下をご覧になるといいと思います。
Migrate to Carbon 2
https://carbon.nesbot.com/docs/#api-carbon-2
↑
下の方にIn Carbon 1, dayOfYear started from 0. Now it starts from 1.みたいな意外とはまりそうなことも小さく書いてあります。
[Laravel5.8] CarbonのImmutable版が使えると何が嬉しいのか
https://nextat.co.jp/staff/archives/217
↑
私の記事よりももっと事細かに丁寧な説明で書かれています。
とりあえずcopy()メソッドのつけ忘れでしょぼいミスばかりしていた自分みたいなヘボプログラマには、この仕様はすごくうれしいです。