#Immutableとは
プログラミングにおいてImmutable(イミュータブル)とは「不変」という意味で、オブジェクトの状態が変わらないことを指します。
逆に、元のデータが変更可能なオブジェクトの性質をMutable(ミュータブル)と言います。
#ImmutableとMutableの違い
Immutable(イミュータブル)とMutable(ミュータブル)の違いについて、実際にみていきましょう。
まずは、日付操作ライブラリ「Carbon」を使って現在日時を取得してみます。
$now = \Carbon\Carbon::now();//2020-05-26 06:57:02.027091
現在日時が取得できました。
次に、addDayメソッドで上記で取得した現在日時に1日加算してみます。
$tomorrow = $now->addDay();//2020-05-27 06:59:01.25073
1日加算されています。
ここで$nowの中身を再びみてみます。
var_dump($now);//2020-05-27 06:59:01.25073
なんと、$nowまで1日加算され、$nowと$tomorrowが同じ結果となってしまいました。
これは、$nowと$tomorrowが同じオブジェクトであるために起こります。
元の状態の変化を防ぐにはcopyメソッドを使います。
#copyメソッドで元の状態を保持
copyメソッドで元のオブジェクトを複製して、2つの変数の結果を見てみましょう。
$tomorrow = $now->copy->addDay();
var_dump($now);//2020-05-26 06:57:02.027091
var_dump($tomorrow);//2020-05-27 06:59:01.25073
元のオブジェクトはそのままで、$tomorrowだけ1日加算されました。
Carbonのバージョン2系では、このImmutable(イミュータブル)版が利用できるようになっています。