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