From c5b0a1127f3ef63750520f06548eed4e7d27a6cc Mon Sep 17 00:00:00 2001 From: Dhrupo Nil Date: Fri, 30 Oct 2026 13:46:19 +0600 Subject: [PATCH] Silence PHP 8.6 tentative return type deprecations in DateTimeImmutable PHP 8.6 gives DateTimeImmutable::add(), sub(), modify(), setDate(), setISODate(), setTime(), setTimestamp(), setTimezone() and createFromInterface() a tentative static return type. Safe's overrides return self, so declaring the class emits nine deprecation notices. Mark them #[\ReturnTypeWillChange], as createFromMutable() and __set_state() already are. --- lib/DateTimeImmutable.php | 9 +++++++++ tests/DateTimeImmutableTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/DateTimeImmutable.php b/lib/DateTimeImmutable.php index 99f74101..7cb973f9 100644 --- a/lib/DateTimeImmutable.php +++ b/lib/DateTimeImmutable.php @@ -96,6 +96,7 @@ public function diff($datetime2, $absolute = false): \DateInterval * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function modify($modify): self { /** @var \DateTimeImmutable|false $result */ @@ -113,6 +114,7 @@ public function modify($modify): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function setDate($year, $month, $day): self { /** @var \DateTimeImmutable|false $result */ @@ -130,6 +132,7 @@ public function setDate($year, $month, $day): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function setISODate($year, $week, $day = 1): self { /** @var \DateTimeImmutable|false $result */ @@ -148,6 +151,7 @@ public function setISODate($year, $week, $day = 1): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function setTime($hour, $minute, $second = 0, $microseconds = 0): self { /** @var \DateTimeImmutable|false $result */ @@ -163,6 +167,7 @@ public function setTime($hour, $minute, $second = 0, $microseconds = 0): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function setTimestamp($unixtimestamp): self { /** @var \DateTimeImmutable|false $result */ @@ -178,6 +183,7 @@ public function setTimestamp($unixtimestamp): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function setTimezone($timezone): self { /** @var \DateTimeImmutable|false $result */ @@ -193,6 +199,7 @@ public function setTimezone($timezone): self * @return DateTimeImmutable * @throws DatetimeException */ + #[\ReturnTypeWillChange] public function sub($interval): self { /** @var \DateTimeImmutable|false $result */ @@ -223,6 +230,7 @@ public function getOffset(): int * @param \DateInterval $interval * @return DateTimeImmutable */ + #[\ReturnTypeWillChange] public function add($interval): self { return self::createFromRegular($this->innerDateTime->add($interval)); @@ -243,6 +251,7 @@ public static function createFromMutable($dateTime): self /** * @return DateTimeImmutable */ + #[\ReturnTypeWillChange] public static function createFromInterface(\DateTimeInterface $object): self { if ($object instanceof \DateTime) { diff --git a/tests/DateTimeImmutableTest.php b/tests/DateTimeImmutableTest.php index 9a0a55e1..1adbe2ab 100644 --- a/tests/DateTimeImmutableTest.php +++ b/tests/DateTimeImmutableTest.php @@ -6,6 +6,30 @@ final class DateTimeImmutableTest extends TestCase { + /** + * PHP 8.6 adds tentative static return types to DateTimeImmutable, so an + * incompatible override is reported once, when the class is declared. + * + * @runInSeparateProcess + */ + public function testDeclaringTheClassTriggersNoDeprecation(): void + { + $deprecations = []; + set_error_handler(static function (int $errno, string $errstr) use (&$deprecations): bool { + $deprecations[] = $errstr; + + return true; + }, E_DEPRECATED); + + try { + self::assertTrue(class_exists(\Safe\DateTimeImmutable::class)); + } finally { + restore_error_handler(); + } + + self::assertSame([], $deprecations); + } + public function testCreateFromMutable(): void { $unsafeDate = new \DateTime('2021-10-16T12:30:16+00:00');