Laravel5.8でバージョンアップされたCarbon2.0の使い方を紹介
昨今の開発案件においてWEB業界を中心に大きく注目されているPHPのフレームワーク【Laravel】ですが、2019年2月26日にそのLaravelのバージョン5.8がリリースされました。
今回は、Laravel5.8の変更点のうち、日付時刻操作ライブラリCarbonのバージョンアップに焦点を当てて、その変更点について紹介していきます。
Laravel5.8とは
2019年2月26日にLaravelのバージョン5.8がリリースされました。 これに伴い、今後の開発案件においては徐々に新しくリリースされた当バージョンに使用するLaravelが切り替わっていくことが予見されます。
Laravelの概要
LaravelとはPHPのフレームワークのひとつです。Laravelは現在のPHPフレームワークの中ではもっとも世界的に注目されており、Laravelの登場以前には主流だったCakePHP等のPHPフレームワークを押しのけて、急激に高い人気を獲得しています。
学習コストが低く、コードを書き易いという点が高く評価されており、Laravelの公式サイトのトップページでも、【Love beautiful code? We do too.】とLaravelが美しいコードで実装できることを主張するメッセージが書かれています。
Laravel5.8で変更された点
世界的に注目を浴びているLaravelですが、2019年2月26日にリリースされたバージョン5.8では次のような変更等がされました。
- EloquentへのhasOneThroughリレーションタイプのサポートの提供
- モデルポリシーの自動検出の導入
- キャッシュの保存期間をPSR-16
(PHPのキャッシュ操作についての標準)に準拠 - Pheanstalk4.0系のサポート
- Carbon2.0系のサポート
この他にも様々な変更がされていますが、これらの変更のうち、本記事では【Carbon2.0系のサポート】について解説していきます。
Laravel5.8で使えるようになったCarbon2.0を紹介
前述の通り、Laravel5.8にはCarbonの2.0系が組み込まれることとなりました。Carbon2.0系には1.0系には存在しない機能としてimmutable版の日付時刻操作メソッドが追加されています。
Carbonとは
CarbonとはPHPのDatetimeクラスをラップした日付時刻操作ライブラリです。直感的で分かりやすい日付・時刻の操作が可能であり、PHPの日付時刻操作ライブラリの中でも高い人気を誇っています。前バージョンであるLaravel5.7まではCarbonのバージョン1.0系が組み込まれていましたが、今回新しくリリースされたLaravel5.8にはCarbonのバージョン2.0系が組み込まれています。
Carbon2.0の変更点
前述の通り、Carbon2.0系では、Carbon1.0系では使用できなかった【immutable版の日付時刻操作メソッド】を使用することが可能となっています。immutableとは直訳すると【不変】であり、プログラミングにおいては【実行元のオブジェクトの値を変更しないまま処理を実行するもの】という意味合いで使われます。immutableは元のオブジェクトの値を変更しないという意味で、【非破壊的】という表現される場合もあります。
逆に、これまでのCarbon1.0に用意されていた日付時刻操作メソッドは、実行元のオブジェクトの値を変更するmutable(可変的、破壊的)なものであると表現されます。プログラミングの学習を始めて間もない方にはimmutableなメソッドとmutableなメソッドについて、どのような使い分けがあり、どのようなメリットがあるのかについてあまりイメージできないかもしれません。
これらは場合によって様々な使い分けがありますが、基本的にはimmutableなメソッドで書かれたプログラムは、バグの発生を抑えられるという傾向があります。これは、値が可変である場合には一度作成した値が現在どのような値になっているのかの保証がないのに対し、不変な値であると分かっている場合にはそれについて考慮する必要がないためです。全ての値をimmutableなものにすればいい、というわけではありませんが、書き換えが不要な値については初めからimmutableなものとして扱うことで、コードのバグを減らし、可読性を上げることが出来るのです。
Carbon2.0の使い方
immutable版の日付時刻操作メソッドは、Carbon\CarbonImmutableが保有しています。そのため、immutable版のメソッドを使用する場合には従来のCarbon\Carbonをインポートするのではなく、Carbon\CarbonImmutableをインポートしてください。
各日付時刻操作メソッドは従来のものと同名で用意されているため、従来のCarbonを使用するのと同じ方法で使うことが可能です。
以下で新しいimmutable版の日付時刻操作メソッドを実行した場合と、従来の日付時刻操作メソッドを実行した場合との比較を行うコードを紹介します。
use Carbon\CarbonImmutable;
use Carbon\Carbon;
// 現在日時のCarbonImmutableオブジェクト, Carbonオブジェクトを作成する( このコードの実行した時間は:2019-03-19 11:13:31 )
$immutable = CarbonImmutable::now();
$mutable = Carbon::now();
// immutable版 => 元の変数の値は変わらない
echo $immutable->addDay(); // 2019-03-20 11:13:31
echo $immutable->addDay(3); // 2019-03-22 11:13:31
echo $immutable; // 2019-03-19 11:13:31
// mutable版 => 元の変数の値が変わる
echo $mutable->addDay(); // 2019-03-20 11:13:31
echo $mutable->addDay(3); // 2019-03-23 11:13:31
echo $mutable; // 2019-03-23 11:13:31
// その他のメソッドもimmutable版は元の変数が変わらない
// (※以下の同名メソッドはmutable版にも用意されている)
$i_date = CarbonImmutable::create(2019, 3, 15, 0, 24, 25, 'Asia/Tokyo');
echo $i_date; // 2019-03-15 00:24:25
echo $i_date->addMonth(); // 2019-04-15 00:24:25
echo $i_date->addYear(); // 2020-03-15 00:24:25
echo $i_date->addHours(); // 2019-03-15 01:24:25
echo $i_date->addMinutes(); // 2019-03-15 00:25:25
echo $i_date->addSecond(); // 2019-03-15 00:24:26
// 同じことをmutable版でやると元の変数が変わり続ける
$m_date = Carbon::create(2019, 3, 15, 0, 24, 25, 'Asia/Tokyo');
echo $m_date; // 2019-03-15 00:24:25
echo $m_date->addMonth(); // 2019-04-15 00:24:25
echo $m_date->addYear(); // 2020-04-15 00:24:25
echo $m_date->addHours(); // 2020-04-15 01:24:25
echo $m_date->addMinutes(); // 2020-04-15 01:25:25
echo $m_date->addSecond(); // 2020-04-15 01:25:26
まとめ
このように、Carbon2.0系ではCarbon\CarbonImmutableにImmutable版の日付時刻操作メソッドが、従来のCarbon\Carbonと同名メソッドで用意されています。
今後、Laravel5.8で実行元のオブジェクトの値を変更させずに日付時刻操作を行いたい場合は、Immutable版の日付時刻操作メソッドを積極的に活用していきましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。