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

Reply via email to