get_object_vars get nothing in child class
| Bug #40757 | get_object_vars get nothing in child class | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Submitted: | 2007-03-08 12:05 UTC | Modified: | 2007-07-24 11:40 UTC |
|
||||||
| From: | nrspark at 163 dot com | Assigned: | dmitry (profile) | |||||||
| Status: | Closed | Package: | Class/Object related | |||||||
| PHP Version: | 5.2.1 | OS: | Windows XP | |||||||
| Private report: | No | CVE-ID: | None | |||||||
[2007-03-08 12:05 UTC] nrspark at 163 dot com
Description:
------------
method to get the private properties of the base object
in base class object, everything ok
in child class use inherit method, get empty
Reproduce code:
---------------
class Base {
private $p1='sadf';
function getFields($obj){
return get_object_vars($obj);
}
}
class Child extends Base { }
$base=new Base();
print_r($base->getFields(new Base()));
$child=new Child();
print_r($child->getFields(new Base()));
Expected result:
----------------
Array ( [p1] => sadf )Array ( [p1] => sadf )
Actual result:
--------------
Array ( [p1] => sadf ) Array ( )
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2007-03-09 10:14 UTC] tony2001@php.net
[2007-03-09 13:06 UTC] nrspark at 163 dot com
but it works expect if the method change to this function getFields($obj){ return array('p1'=>$obj->p1); } and it work expect in java using reflection think about: Liskov Substitution Principle i thing this is the implemention bug of get_object_vars[2007-03-13 11:38 UTC] tony2001@php.net
>but it works expect if the method change to this >function getFields($obj){ return array('p1'=>$obj->p1); } Surely Base class can access it's own private properties. The method belongs to the Base and is executed in it's scope.[2007-03-13 13:15 UTC] nrspark at 163 dot com
[2007-06-25 14:07 UTC] dennis at d23 dot nl
I have to agree that something seems bugged here. Consider the following example: --------------------------------------------------------------------------------------- <?php class Base { private $baseA = 'BaseA'; function __construct() { echo __METHOD__.' : '. print_r(get_object_vars($this), true)."\n"; echo 'Direct base : '.$this->baseA."\n"; echo 'Direct child : '.$this->childA."\n"; } } class Child extends Base{ private $childA = 'ChildA'; function __construct() { parent::__construct(); echo __METHOD__.' : '.print_r(get_object_vars($this), true)."\n"; } } $child = new Child(); ?> --------------------------------------------------------------------------------------- Expected Result: Base::__construct : Array ( [baseA] => BaseA ) Direct base : BaseA <br /> <b>Fatal error</b>: Cannot access private property Child::$childA in <b>PHPDocument7</b> on line <b>9</b><br /> --------------------------------------------------------------------------------------- Actual Result: Base::__construct : Array ( [childA] => ChildA ) Direct base : BaseA <br /> <b>Fatal error</b>: Cannot access private property Child::$childA in <b>PHPDocument7</b> on line <b>9</b><br /> ======================================================================================= It dies properly on $childA reference in the parent class, but interestingly get_object_vars() has no issue with retrieving them. In other words get_object_vars() does not seem to respect the scope in which it was called. Following test http://lxr.php.net/source/ZendEngine2/tests/bug27798.phpt misses the situation because it overrides the private property.[2007-07-14 09:34 UTC] jani@php.net
[2007-07-24 11:40 UTC] dmitry@php.net