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 (profile)
Status: Closed Package: Class/Object related
PHP Version: 5.2.1 OS: Windows XP
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: nrspark at 163 dot com
New email:
PHP Version: OS:

 

 [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

Pull Requests

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-2025 The PHP Group
All rights reserved.
Last updated: Tue Apr 01 03:01:29 2025 UTC