Commit acf7ba883f8 for php.net

commit acf7ba883f86e9c7abb51e416ac67ba58f17331f
Author: Daniel Scherzer <daniel.e.scherzer@gmail.com>
Date:   Sun Jul 19 10:14:34 2026 -0700

    Reflection: improve error messages for lazy initialization errors

    Improve error messages from `reflection_property_check_lazy_compatible()`, as
    triggered by both `ReflectionProperty::setRawValueWithoutLazyInitialization()`
    and `ReflectionProperty::skipLazyInitialization()`. Say "cannot" instead of
    "can not", and include parentheses after the method name.

diff --git a/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt b/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt
index 9151e58f3fc..3c9686ba04c 100644
--- a/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt
+++ b/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt
@@ -38,6 +38,6 @@ function test(string $name, object $obj) {
 ?>
 --EXPECT--
 # Ghost
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on dynamic property C::$dyn
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on dynamic property C::$dyn
 # Proxy
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on dynamic property C::$dyn
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on dynamic property C::$dyn
diff --git a/Zend/tests/lazy_objects/skipLazyInitialization.phpt b/Zend/tests/lazy_objects/skipLazyInitialization.phpt
index 4fc47b13db6..8a95e684a5a 100644
--- a/Zend/tests/lazy_objects/skipLazyInitialization.phpt
+++ b/Zend/tests/lazy_objects/skipLazyInitialization.phpt
@@ -198,10 +198,10 @@ function __toString() {
 ## Property [ public static $static = 'static' ]

 skipInitializerForProperty():
-ReflectionException: Can not use skipLazyInitialization on static property A::$static
+ReflectionException: Cannot use skipLazyInitialization() on static property A::$static

 setRawValueWithoutLazyInitialization():
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on static property A::$static
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on static property A::$static

 ## Property [ public $noDefault = NULL ]

@@ -238,10 +238,10 @@ function __toString() {
 ## Property [ public virtual $virtual { get; set; } ]

 skipInitializerForProperty():
-ReflectionException: Can not use skipLazyInitialization on virtual property A::$virtual
+ReflectionException: Cannot use skipLazyInitialization() on virtual property A::$virtual

 setRawValueWithoutLazyInitialization():
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on virtual property A::$virtual
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on virtual property A::$virtual

 ## Property [ $dynamicProp ]

@@ -295,10 +295,10 @@ function __toString() {
 ## Property [ public static $static = 'static' ]

 skipInitializerForProperty():
-ReflectionException: Can not use skipLazyInitialization on static property A::$static
+ReflectionException: Cannot use skipLazyInitialization() on static property A::$static

 setRawValueWithoutLazyInitialization():
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on static property A::$static
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on static property A::$static

 ## Property [ public $noDefault = NULL ]

@@ -335,10 +335,10 @@ function __toString() {
 ## Property [ public virtual $virtual { get; set; } ]

 skipInitializerForProperty():
-ReflectionException: Can not use skipLazyInitialization on virtual property A::$virtual
+ReflectionException: Cannot use skipLazyInitialization() on virtual property A::$virtual

 setRawValueWithoutLazyInitialization():
-ReflectionException: Can not use setRawValueWithoutLazyInitialization on virtual property A::$virtual
+ReflectionException: Cannot use setRawValueWithoutLazyInitialization() on virtual property A::$virtual

 ## Property [ $dynamicProp ]

diff --git a/Zend/tests/lazy_objects/skipLazyInitialization_no_dynamic_prop.phpt b/Zend/tests/lazy_objects/skipLazyInitialization_no_dynamic_prop.phpt
index 74e12cb3629..dbbe88c52a2 100644
--- a/Zend/tests/lazy_objects/skipLazyInitialization_no_dynamic_prop.phpt
+++ b/Zend/tests/lazy_objects/skipLazyInitialization_no_dynamic_prop.phpt
@@ -38,6 +38,6 @@ function test(string $name, object $obj) {
 ?>
 --EXPECT--
 # Ghost
-ReflectionException: Can not use skipLazyInitialization on dynamic property C::$dyn
+ReflectionException: Cannot use skipLazyInitialization() on dynamic property C::$dyn
 # Proxy
-ReflectionException: Can not use skipLazyInitialization on dynamic property C::$dyn
+ReflectionException: Cannot use skipLazyInitialization() on dynamic property C::$dyn
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index bba42bdfcc1..3e1e41893e7 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -6039,7 +6039,7 @@ static zend_result reflection_property_check_lazy_compatible(
 {
 	if (!prop) {
 		zend_throw_exception_ex(reflection_exception_ptr, 0,
-				"Can not use %s on dynamic property %s::$%s",
+				"Cannot use %s() on dynamic property %s::$%s",
 				method, ZSTR_VAL(scope->name),
 				ZSTR_VAL(unmangled_name));
 		return FAILURE;
@@ -6047,7 +6047,7 @@ static zend_result reflection_property_check_lazy_compatible(

 	if (prop->flags & ZEND_ACC_STATIC) {
 		zend_throw_exception_ex(reflection_exception_ptr, 0,
-				"Can not use %s on static property %s::$%s",
+				"Cannot use %s() on static property %s::$%s",
 				method, ZSTR_VAL(prop->ce->name),
 				ZSTR_VAL(unmangled_name));
 		return FAILURE;
@@ -6055,7 +6055,7 @@ static zend_result reflection_property_check_lazy_compatible(

 	if (prop->flags & ZEND_ACC_VIRTUAL) {
 		zend_throw_exception_ex(reflection_exception_ptr, 0,
-				"Can not use %s on virtual property %s::$%s",
+				"Cannot use %s() on virtual property %s::$%s",
 				method, ZSTR_VAL(prop->ce->name),
 				ZSTR_VAL(unmangled_name));
 		return FAILURE;
@@ -6065,7 +6065,7 @@ static zend_result reflection_property_check_lazy_compatible(
 		&& !zend_class_can_be_lazy(object->ce)
 	) {
 		zend_throw_exception_ex(reflection_exception_ptr, 0,
-				"Can not use %s on internal class %s",
+				"Cannot use %s() on internal class %s",
 				method, ZSTR_VAL(object->ce->name));
 		return FAILURE;
 	}
diff --git a/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt b/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
index bb7bb56c0fa..8bd82ff6402 100644
--- a/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
+++ b/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
@@ -38,14 +38,14 @@ function test(object $obj, string $propertyName) {

 ?>
 --EXPECT--
-Can not use setRawValueWithoutLazyInitialization on static property Demo::$myStatic
-Can not use skipLazyInitialization on static property Demo::$myStatic
+Cannot use setRawValueWithoutLazyInitialization() on static property Demo::$myStatic
+Cannot use skipLazyInitialization() on static property Demo::$myStatic

-Can not use setRawValueWithoutLazyInitialization on virtual property Demo::$myVirtual
-Can not use skipLazyInitialization on virtual property Demo::$myVirtual
+Cannot use setRawValueWithoutLazyInitialization() on virtual property Demo::$myVirtual
+Cannot use skipLazyInitialization() on virtual property Demo::$myVirtual

-Can not use setRawValueWithoutLazyInitialization on dynamic property Demo::$myDynamic
-Can not use skipLazyInitialization on dynamic property Demo::$myDynamic
+Cannot use setRawValueWithoutLazyInitialization() on dynamic property Demo::$myDynamic
+Cannot use skipLazyInitialization() on dynamic property Demo::$myDynamic

-Can not use setRawValueWithoutLazyInitialization on internal class ReflectionClass
-Can not use skipLazyInitialization on internal class ReflectionClass
+Cannot use setRawValueWithoutLazyInitialization() on internal class ReflectionClass
+Cannot use skipLazyInitialization() on internal class ReflectionClass
diff --git a/ext/reflection/tests/property_hooks/gh17713.phpt b/ext/reflection/tests/property_hooks/gh17713.phpt
index c6d4d241bc5..edd0e120465 100644
--- a/ext/reflection/tests/property_hooks/gh17713.phpt
+++ b/ext/reflection/tests/property_hooks/gh17713.phpt
@@ -157,7 +157,7 @@ function test($scope, $class, $prop) {
 # Accessing Base->virtualProp from scope Base
 Must not write to virtual property Base::$virtualProp
 Must not read from virtual property Base::$virtualProp
-Can not use setRawValueWithoutLazyInitialization on virtual property Base::$virtualProp
+Cannot use setRawValueWithoutLazyInitialization() on virtual property Base::$virtualProp
 Must not read from virtual property Base::$virtualProp
 # Accessing Test->dynamicProp from scope Base
 int(42)
@@ -165,5 +165,5 @@ function test($scope, $class, $prop) {
 # Accessing Test->changedProp from scope Base
 May not use setRawValue on static properties
 May not use getRawValue on static properties
-Can not use setRawValueWithoutLazyInitialization on static property Test::$changedProp
+Cannot use setRawValueWithoutLazyInitialization() on static property Test::$changedProp
 May not use getRawValue on static properties