From 0a3b1aeb07706c5c3354f80e5e38716f3425bbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 7 Aug 2026 13:04:24 +0200 Subject: [PATCH] date: Correctly handle `Duration::__construct()` calls Co-authored-by: Nora Dossche <7771979+ndossche@users.noreply.github.com> --- ext/date/tests/time/duration/readonly.phpt | 13 +++++++++++++ ext/date/time_duration.c | 1 + 2 files changed, 14 insertions(+) diff --git a/ext/date/tests/time/duration/readonly.phpt b/ext/date/tests/time/duration/readonly.phpt index 36b407138fee..ca527fe43c59 100644 --- a/ext/date/tests/time/duration/readonly.phpt +++ b/ext/date/tests/time/duration/readonly.phpt @@ -89,6 +89,16 @@ echo "====", PHP_EOL; var_dump((new ReflectionProperty($d, 'seconds'))->isWritable(null, $d)); +echo "====", PHP_EOL; + +try { + (new ReflectionMethod($d, '__construct'))->invoke($d); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} + +echo f($d), PHP_EOL; + ?> --EXPECT-- Error: Cannot modify readonly property Time\Duration::$seconds @@ -112,3 +122,6 @@ Error: Cannot modify readonly property Time\Duration::$seconds Error: Cannot modify protected(set) readonly property Time\Duration::$seconds from global scope ==== bool(false) +==== +Error: Cannot directly construct Time\Duration, use Time\Duration::from*() methods instead + +1.000000000 diff --git a/ext/date/time_duration.c b/ext/date/time_duration.c index d9952a829d2c..14c121ff29bb 100644 --- a/ext/date/time_duration.c +++ b/ext/date/time_duration.c @@ -146,6 +146,7 @@ ZEND_ATTRIBUTE_NODISCARD static zend_result create_duration(zval *target, zend_u PHP_METHOD(Time_Duration, __construct) { + zend_throw_error(NULL, "Cannot directly construct Time\\Duration, use Time\\Duration::from*() methods instead"); } PHP_METHOD(Time_Duration, fromSeconds)