Bug #47808 [Com]: hasProperty inconsistent with getProperty and new ReflectionProperty
| From: | f1690403 at trbvm dot com | Date: | Wed, 18 Mar 2015 12:41:59 +0000 |
| Subject: | Bug #47808 [Com]: hasProperty inconsistent with getProperty and new ReflectionProperty | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-191446@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
Comment by: f1690403 at trbvm dot com
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)
Block user comment: N
Private report: N
New Comment:
6 years later, the problem still exists in PHP Version 5.3.10-1ubuntu3.15
Previous Comments:
------------------------------------------------------------------------
[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