はじめに
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