Hello,
Class ReflectionProperty allows to get access to private properties in
library. Unfortunately there is one unexpected (or at least undocumented)
case - ReflectionProperty tries execute __call method. In my opinion
this approach is bad, because method __call can change state of
application (I'd like to read value, not execute code). I'd like to suggest
different approach:
- Method ReflectionProperty->getValue will throw exception when
property is removed. - Class ReflectionProperty will receive new method - exists.
Code - http://ideone.com/A23YKF
Best regards
On Wed, Jul 19, 2017 at 9:53 AM, Bartłomiej Krukowski <
krukowski.bartlomiej@gmail.com> wrote:
Hello,
Class ReflectionProperty allows to get access to private properties in
library. Unfortunately there is one unexpected (or at least undocumented)
case - ReflectionProperty tries execute __call method. In my opinion
this approach is bad, because method __call can change state of
application (I'd like to read value, not execute code).
This is expected behavior - the reflection API does not work around the
rules of the engine, just the rules of scope (like closures do).
See https://bugs.php.net/bug.php?id=63463 for a very similar report that
was discussed and marked as "not a bug" ages ago.
I'd like to suggest
different approach:
- Method ReflectionProperty->getValue will throw exception when
property is removed.
It should just call __get
as before - see also
https://bugs.php.net/bug.php?id=72174 and https://github.com/php/php-
src/commit/a1ed4ab3caf33b59742897b43462d033864bb490 - reflection shouldn't
check if the property exists upfront.
- Class ReflectionProperty will receive new method - exists.
You can already use array_key_exists($propertyFqn, (array) $object);
for
that.
Marco Pivetta