Commit d22965337cd for php.net
commit d22965337cd8e5ced274d6e7a2cfd07593e5efbf
Author: Tim Düsterhus <tim@bastelstu.be>
Date: Fri Aug 7 13:59:38 2026 +0200
date: Correctly handle `Duration::__construct()` calls (#23098)
Co-authored-by: Nora Dossche <7771979+ndossche@users.noreply.github.com>
diff --git a/ext/date/tests/time/duration/readonly.phpt b/ext/date/tests/time/duration/readonly.phpt
index 36b407138fe..ca527fe43c5 100644
--- a/ext/date/tests/time/duration/readonly.phpt
+++ b/ext/date/tests/time/duration/readonly.phpt
@@ -89,6 +89,16 @@
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 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 d9952a829d2..14c121ff29b 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)