Bug #47808 [Csd]: hasProperty inconsistent with getProperty and new ReflectionProperty

From: Date: Wed, 18 Mar 2015 18:29:44 +0000
Subject: Bug #47808 [Csd]: hasProperty inconsistent with getProperty and new ReflectionProperty
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-191451@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=47808&edit=1 ID: 47808 Updated by: requinix@php.net Reported by: sven dot arduwie at gmail dot com Summary: hasProperty inconsistent with getProperty and new ReflectionProperty Status: Closed Type: Bug Package: Reflection related Operating System: * PHP Version: 5.*, 6CVS (2009-05-14) -Assigned To: +Assigned To: requinix Block user comment: N Private report: N New Comment: @f1690403: http://3v4l.org/tg5Cf http://3v4l.org/PRA1f Both sven.arduwie's and voyager's code work correctly as of 5.3.2. Can you be more descriptive than just "problem still exists"? And have you tested with PHP versions that are still supported? Previous Comments: ------------------------------------------------------------------------ [2015-03-18 12:41:58] f1690403 at trbvm dot com 6 years later, the problem still exists in PHP Version 5.3.10-1ubuntu3.15 ------------------------------------------------------------------------ [2009-08-04 15:04:22] jani@php.net This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. ------------------------------------------------------------------------ [2009-05-12 16:41:48] voyager at voyd dot net I 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 ------------------------------------------------------------------------ [2009-05-06 00:33:51] kalle@php.net 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 maintainers ------------------------------------------------------------------------ [2009-03-27 14:59:20] 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 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=47808&edit=1

« previous php.bugs (#191451) next »