|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-03-27 14:59 UTC] sven dot arduwie at gmail dot com
Description:
------------
In the reproduce code hasProperty() in Base::__get() returns true while getProperty() throws an exception with message "Fatal error: Uncaught exception 'ReflectionException' with message 'Property test does not exist'"
A more appropriate message would be "Fatal error: Uncaught exception 'ReflectionException' with message 'Cannot access non-public member Child::test'", OR, and perhaps this would be best, change the behavior of hasProperty() to return false.
The current behavior is really annoying if you're, like me, trying to write a __get() method that returns the value of private/protected properties using 'getters', e.g.: getMyProperty() for property $myProperty.
Reproduce code:
---------------
<?php
class Base {
public function __get($property) {
$reflector = new ReflectionObject($this);
if ($reflector->hasProperty($property)) {
return $reflector->getProperty($property)->getValue();
}
}
}
class Child extends Base {
private $test = 'This is a test.';
}
class Test extends Child {
}
$test = new Test;
var_dump($test->test);
Expected result:
----------------
getProperty() to throw "Fatal error: Uncaught exception 'ReflectionException' with message 'Cannot access non-public member Child::test'"
or
hasProperty() to return false
Actual result:
--------------
hasProperty() returns true while getProperty() throws a message with an inappropriate message
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 05:00:01 2025 UTC |
You must check the visibility of a property aswell from the ReflectionProperty instance created by getProperty(): if(($property = $reflector->getProperty($property)) && $property->isPublic()) { /* callable */ } However it looks trival, I'll leave this for one of the maintainersI am also experiencing this issue. It appears to only be a problem with extended classes. For example: class A { private $var; } class B extends A { } $ro = new ReflectionObject(new A()); echo $ro->hasProperty('var') ? 'true' : 'false', "\n"; // returns true echo $ro->getProperty('var'), "\n"; // prints property $ro = new ReflectionObject(new B()); echo $ro->hasProperty('var') ? 'true' : 'false', "\n"; // returns true echo $ro->getProperty('var'), "\n"; // throws exception