ID: 40757 Comment by: dennis at d23 dot nl Reported By: nrspark at 163 dot com Status: Open Bug Type: Class/Object related Operating System: Windows XP PHP Version: 5.2.1 New Comment:
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. Previous Comments: ------------------------------------------------------------------------ [2007-03-13 13:15:38] nrspark at 163 dot com code 1: use get_object_vars 1>I would be very surprised to be able to access private properties of 1>Base in the context of Child. code 2: direct access 2>Surely Base class can access it's own private properties. 2>The method belongs to the Base and is executed in it's scope. $child=new Child(); $child->getFields(new Base()); what is the context of the method? base or child? the result direct access and get_object_vars must be the same. it is a bug that the get_object_vars function do not check the method belongs to, but just check the object class call the method. ------------------------------------------------------------------------ [2007-03-13 11:38:52] [EMAIL PROTECTED] >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-09 13:06:23] 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-09 10:14:42] [EMAIL PROTECTED] I would be very surprised to be able to access private properties of Base in the context of Child. What you see is expected. ------------------------------------------------------------------------ [2007-03-08 12:05:12] 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 ( ) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=40757&edit=1