[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