[php-src] master: Reflection: improve error messages for lazy initialization errors

Daniel Scherzer <[email protected]> Mon, 27 Jul 2026 17:37:49 +0000
Newsgroups gmane.comp.php.cvs.general
Message-ID <[email protected]>
Author: Daniel Scherzer (DanielEScherzer)
Date: 2026-07-27T10:36:50-07:00

Commit: https://github.com/php/php-src/commit/acf7ba883f86e9c7abb51e416ac67ba58f17331f
Raw diff: https://github.com/php/php-src/commit/acf7ba883f86e9c7abb51e416ac67ba58f17331f.diff

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.

Changed paths:
  M  Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt
  M  Zend/tests/lazy_objects/skipLazyInitialization.phpt
  M  Zend/tests/lazy_objects/skipLazyInitialization_no_dynamic_prop.phpt
  M  ext/reflection/php_reflection.c
  M  ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
  M  ext/reflection/tests/property_hooks/gh17713.phpt


Diff:

diff --git a/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt b/Zend/tests/lazy_objects/setRawValueWithoutLazyInitialization_no_dynamic_prop.phpt
index 9151e58f3fc6..3c9686ba04c4 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 @@ test('Proxy', $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 4fc47b13db67..8a95e684a5a2 100644
--- a/Zend/tests/lazy_objects/skipLazyInitialization.phpt
+++ b/Zend/tests/lazy_objects/skipLazyInitialization.phpt
@@ -198,10 +198,10 @@ getValue(): string(5) "value"
 ## 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 @@ getValue(): string(5) "value"
 ## 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 @@ getValue(): string(5) "value"
 ## 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 @@ getValue(): string(5) "value"
 ## 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 74e12cb3629f..dbbe88c52a2c 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 @@ test('Proxy', $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 bba42bdfcc1a..3e1e41893e72 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 bb7bb56c0fa9..8bd82ff64020 100644
--- a/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
+++ b/ext/reflection/tests/ReflectionProperty_lazy_initialization_errors.phpt
@@ -38,14 +38,14 @@ test($obj, 'name');
 
 ?>
 --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 c6d4d241bc50..edd0e1204658 100644
--- a/ext/reflection/tests/property_hooks/gh17713.phpt
+++ b/ext/reflection/tests/property_hooks/gh17713.phpt
@@ -157,7 +157,7 @@ int(43)
 # 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 @@ int(43)
 # 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