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

Reply via email to