[PHP] CarbonインスタンスをCarbonImmutableに変換する方法

PHP PHP
主にPHPに関する記事

はじめに

PHPで日付を扱う際、Carbonライブラリは非常に便利です。

しかし、場合によっては、変更可能な Carbon インスタンスを変更不可能な CarbonImmutable インスタンスに変換して、作成後に日付オブジェクトが変更されないようにしたいことがあります。

この記事では、Carbon と CarbonImmutable の違い、および変換方法について解説します。


Carbon と CarbonImmutable の違い

  • Carbon 変更可能(mutable)な日付オブジェクト。 同じインスタンスを直接変更できます。
$date = Carbon::now();
$date->addDay(); // 元のオブジェクトが変更される
  • CarbonImmutable
    • 変更不可能(immutable)な日付オブジェクト。 変更操作は新しいインスタンスを返し、元のオブジェクトは変わりません。
$date = CarbonImmutable::now();
$newDate = $date->addDay(); // 元の$dateはそのまま

Carbon から CarbonImmutable への変換

すでに Carbon インスタンスを持っていて、それを変更不可能にしたい場合は、toImmutable() メソッドを使います。

例:

use Carbon\Carbon;

$carbon = Carbon::now();
$immutable = $carbon->toImmutable();

echo get_class($carbon);     // Carbon\Carbon
echo get_class($immutable);  // Carbon\CarbonImmutable

CarbonImmutable から Carbon への変換

変更不可能なインスタンスを、再び変更可能にしたい場合は、toMutable() メソッドを使います。

例:

use Carbon\CarbonImmutable;

$immutable = CarbonImmutable::now();
$mutable = $immutable->toMutable();

echo get_class($immutable); // Carbon\CarbonImmutable
echo get_class($mutable);   // Carbon\Carbon

Immutable な日付を使うべきケース

CarbonImmutable の使用が適しているのは以下のような場面です:

  • 履歴やログなど、後から変更されてはいけないデータを扱う場合
  • 入力値を変えない純粋関数(pure function)を書く場合
  • アプリケーションのドメイン層で厳格な不変性を求める場合

まとめ

  • Carbon = 変更可能、CarbonImmutable = 変更不可能
  • 変換方法:
    • $carbon->toImmutable() → Carbon → CarbonImmutable
    • $immutable->toMutable() → CarbonImmutable → Carbon
  • Immutable は意図しない変更を防ぐために有効

この変換を理解して使い分ければ、より安全で予測可能な日付処理が可能になります。

著者

Webエンジニア歴30年、フリーランスバックエンドエンジニア。

PHP歴約30年(Laravel 7年・FuelPHP 5年・CakePHP・自作FW)、
JavaScript歴約20年(React・Vue各4年)。
AWS(EC2 / CloudFront / RDS / API Gateway など)・
GCP(BigQuery)を使ったバックエンド開発を中心に、
複数の事業会社・受託案件でシステム設計から実装・運用まで担当しています。

PHPがバージョン4の時代から書いており、
Laravelが普及する前のフレームワーク乱立期も経験しています。
「昔はこう書いていたが今はこう」という変遷を肌で知っているエンジニアとして、
単なるコマンドの使い方だけでなく、なぜそうするのかの背景まで伝えることを意識して書いています。

このブログでは、実務で実際に詰まった箇所・調べたこと・気づいたことを
そのまま記事にしています。誰かの「詰まり」が解決するきっかけになれば幸いです。

千原 耕司をフォローする

役にたったと思ったら応援をお願いします m(._.)m

PHP
スポンサーリンク
シェアする
千原 耕司をフォローする
タイトルとURLをコピーしました