ID: 40757 Updated by: [EMAIL PROTECTED] Reported By: nrspark at 163 dot com -Status: Open +Status: Assigned Bug Type: Class/Object related Operating System: Windows XP PHP Version: 5.2.1 -Assigned To: +Assigned To: dmitry New Comment:
Dmitry, check this out please. Previous Comments: ------------------------------------------------------------------------ [2007-06-25 14:07:41] 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-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. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/40757 -- Edit this bug report at http://bugs.php.net/?id=40757&edit=1