php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #40757 get_object_vars get nothing in child class
Submitted: 2007-03-08 12:05 UTC Modified: 2007-07-24 11:40 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:0 of 0 (0.0%)
From: nrspark at 163 dot com Assigned: dmitry
Status: Closed Package: Class/Object related
PHP Version: 5.2.1 OS: Windows XP
Private report: No CVE-ID:
 [2007-03-08 12:05 UTC] 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 ( )

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-03-09 10:14 UTC] tony2001@php.net
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-09 13:06 UTC] 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-13 11:38 UTC] 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-13 13:15 UTC] 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-06-25 14:07 UTC] 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-07-14 09:34 UTC] jani@php.net
Dmitry, check this out please.
 [2007-07-24 11:40 UTC] dmitry@php.net
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.


 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 17 03:01:55 2014 UTC