はじめに
PHP8の上級試験では、DateTime
と DateTimeImmutable
の違いを問う問題がよく出ます。DateTimeImmutable
は名前の通り「変更できない日付時刻オブジェクト」であり、add()
や sub()
を呼んでも 元のオブジェクトは変化せず、新しいオブジェクトが返る という挙動を正確に理解する必要があります。
目次
DateTimeとDateTimeImmutableの違い
クラス | 変更可能か | add()の挙動 |
---|---|---|
DateTime | mutable(変更可) | 同じオブジェクトが更新される |
DateTimeImmutable | immutable(変更不可) | 新しいオブジェクトが返る |
💡 ポイント
DateTimeImmutable
は 内部状態を変更できないadd()
の返
コード例
<?php
declare(strict_types=1);
error_reporting(-1);
// Immutableオブジェクト生成
$dobj = new DateTimeImmutable('2025-10-11');
// add() は新しいオブジェクトを返す
$newDobj = $dobj->add(new DateInterval('P1D'));
echo $dobj->format('Y-m-d') . PHP_EOL; // 元のオブジェクトはそのまま
echo $newDobj->format('Y-m-d') . PHP_EOL; // 1日後の日付
出力結果
2025-10-11
2025-10-12
図解イメージ(ASCIIアート)
$dobj (2025-10-11)
|
| add(P1D)
v
$newDobj (2025-10-12)
$dobj
は変更されず$newDobj
に1日後の日付が入る
注意点(試験対策)
DateTimeImmutable
に対してadd()
やmodify()
を呼んでも Fatal error は発生しない- 「Cannot modify an instance…」というエラーは 誤り
- 常に 返り値を受け取る ことを意識する
まとめ
- DateTimeImmutable = 変更不可(immutable)
- add/sub/modify すると 新しいオブジェクトを返す
- 元のオブジェクトを直接変更することはできない
- 試験問題では、返り値を受け取るかどうかで正誤が分かれることが多い
💡 覚え方:
DateTime -> mutable
DateTimeImmutable -> "I" = Immutable