#40757 [Asn->Csd]: get_object_vars get nothing in child class

From: Date: Tue, 24 Jul 2007 11:40:43 +0000
Subject: #40757 [Asn->Csd]: get_object_vars get nothing in child class
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-115374@lists.php.net to get a copy of this message
 ID:               40757
 Updated by:       dmitry@php.net
 Reported By:      nrspark at 163 dot com
-Status:           Assigned
+Status:           Closed
 Bug Type:         Class/Object related
 Operating System: Windows XP
 PHP Version:      5.2.1
 Assigned To:      dmitry
 New Comment:

This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------

[2007-07-14 09:34:07] jani@php.net

Dmitry, check this out please.

------------------------------------------------------------------------

[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] 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

------------------------------------------------------------------------

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


Thread (8 messages)

« previous php.bugs (#115374) next »