ミュータブルとイミュータブルの違いです。
目次
説明 | ミュータブル(可変) |
イミュータブル(不変) |
ミュータブル(可変)
- インスタンス(オブジェクト)の状態を変更できるインスタンス(オブジェクト)です。
- 日時の計算等で使用するPHPのDateTimeのインスタンスは、日時の加算でインスタンスの状態が変わります。
→ミュータブルです。 - 想定していない更新が起こる可能性があるためイミュータブルより安全性は落ちます。
- mutableは、可変という意味です。
ミュータブルのサンプルです。コードはPHPです。
<?php
//ミュータブルの例
$date1 = new DateTime('2020-8-10 22:30:10');
// 3日後を求める
$date2 = $date1->modify("+3 day");
print $date2->format("Y/m/d"); // 2020/08/13
// 3日後を求める
$date3 = $date1->modify("+3 day");
print $date3->format("Y/m/d"); // 2020/08/16
3行目は、DateTimeのインスタンスを生成しています。
6行目は、$date1の3日後を求め、$date2に代入しています。
このときインスタンスの$date1も3日増えます。(状態が変わる)
10行目は、3行目の$date1の3日後を求めようとしますが、
6行目で$date1は3日増えた状態になっているので
結果として$date3は6日増えます。
→ミュータブルです。
イミュータブル(不変)
- インスタンス(オブジェクト)の状態を変更できないインスタンス(オブジェクト)です。
- 日時の計算等で使用するPHPのDateTimeImmutableのインスタンスは、日時の加算で新しいインスタンスを返します。元のインスタンスの状態は変わりません。
→イミュータブルです。 - 想定していない更新を防ぐことができるためミュータブルより安全度があります。
- immutableは、不変という意味です。
イミュータブルのサンプルです。コードはPHPです。
<?php
//イミュータブルの例
$date1 = new DateTimeImmutable('2020-8-10 22:30:10');
// 3日後を求める
$date2 = $date1->modify("+3 day");
print $date2->format("Y/m/d"); // 2020/08/13
// 3日後を求める
$date3 = $date1->modify("+3 day");
print $date3->format("Y/m/d"); // 2020/08/13
3行目は、DateTimeImmutableのインスタンスを生成しています。
6行目は、$date1の3日後を求め、$date2に代入しています。
このときインスタンスの$date1は3日増えません(状態が変わらない)。3日増えたコピーを返します。
10行目は3行目の$date1の3日後を求め
結果として$date3に3日増えます。
→イミュータブルです。
関連の記事