|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[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 ( )
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 09:00:02 2025 UTC |
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>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.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.