#40757 [Com]: get_object_vars get nothing in child class

From: Date: Mon, 25 Jun 2007 14:07:41 +0000
Subject: #40757 [Com]: get_object_vars get nothing in child class
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-114158@lists.php.net to get a copy of this message
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] 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-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] tony2001@php.net 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

« previous php.bugs (#114158) next »