Fix Lazy Objects Reflection API: add getRawValueWithoutLazyInitialization(), isLazy() #16527
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is a bug fix for a design flaw in the Lazy Objects Reflection API:
The API provides
ReflectionProperty::setRawValueWithoutLazyInitialization()
andReflectionProperty::skipLazyInitialization()
, but does not provide any way to fetch the value of a property without triggering initialization, or to check if a property is lazy.A workaround is to cast the object as array (with
(array) $obj
), but this is slower than needed and is used in performance-critical code in Doctrine, for instance.This PR fixes this by adding the methods
ReflectionProperty::getRawValueWithoutLazyInitialization(object $obj)
and `ReflectionProperty::isLazy(object $obj).getRawValueWithoutLazyInitialization()
returnsNULL
if the property is lazy, and behaves likegetRawValue()
otherwise.