Bug #47808 [Csd]: hasProperty inconsistent with getProperty and new ReflectionProperty
| From: | requinix@php.net | 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