#46812 [NoF->Opn]: get_class_vars() does not include visible private variable looking at subclass
| From: | phpbug dot classvars at sub dot noloop dot net | Date: | Thu, 30 Apr 2009 14:06:13 +0000 |
| Subject: | #46812 [NoF->Opn]: get_class_vars() does not include visible private variable looking at subclass | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-136577@lists.php.net to get a copy of this message | ||
ID: 46812
User updated by: phpbug dot classvars at sub dot noloop dot net
Reported By: phpbug dot classvars at sub dot noloop dot net
-Status: No Feedback
+Status: Open
Bug Type: Class/Object related
Operating System: Linux
-PHP Version: 5.2.8
+PHP Version: 5.2.8 and php-5.2-200904301230
New Comment:
This problem still occurs with
http://snaps.php.net/php5.2-200904301230.tar.bz2:
% ~/devel/php/php-5.2-200904301230/bin/php -v
PHP 5.2.10-dev (cli) (built: Apr 30 2009 16:00:22)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
% ~/devel/php/php-5.2-200904301230/bin/php test.php
---------------
Array
(
[private_a] =>
)
Array
(
)
Previous Comments:
------------------------------------------------------------------------
[2009-04-18 01:00:00] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
------------------------------------------------------------------------
[2009-04-10 18:50:59] jani@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://windows.php.net/snapshots/
------------------------------------------------------------------------
[2008-12-12 14:33:21] msaraujo@php.net
ZEND_FUNCTION(get_class_vars)
{
char *class_name;
int class_name_len;
zend_class_entry **pce;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &class_name,
&class_name_len) == FAILURE) {
return;
}
if (zend_lookup_class(class_name, class_name_len, &pce TSRMLS_CC) ==
FAILURE) {
RETURN_FALSE;
} else {
array_init(return_value);
zend_update_class_constants(*pce TSRMLS_CC);
if ((*pce)->parent) {
add_class_vars((*pce)->parent, &(*pce)->parent->default_properties,
return_value TSRMLS_CC);
add_class_vars((*pce)->parent, CE_STATIC_MEMBERS((*pce)->parent),
return_value TSRMLS_CC)
}
else {
add_class_vars(*pce, &(*pce)->default_properties, return_value
TSRMLS_CC);
add_class_vars(*pce, CE_STATIC_MEMBERS(*pce), return_value
TSRMLS_CC);
}
}
}
------------------------------------------------------------------------
[2008-12-09 10:13:30] phpbug dot classvars at sub dot noloop dot net
Description:
------------
Even after bug #45862, #46761 and #46795 there is something really
weird going on with get_class_vars(). It seems to be the consensus of
the developers that get_class_vars() should return all properties of the
given class that are _visible_ from the context calling get_class_vars()
(nevermind that the docs claim "returns ... public properties of the
class" (see #46795)). (Also, #31543 seems to contradict everything else)
But get_class_vars() does not return visible private properties when
invoked on a subclass.
In the attached code, the second call to dumpClass should return
'private_a', as $private_a would still be visible in methods in A, even
if the object in question actually is of type B.
As a side note, I find it a bit strange that the behaviour of
get_class_vars() function changed between 5.2.6 and 5.2.7 (it broke a
real-world inhouse app here, for example) :)
Reproduce code:
---------------
<?php
class A {
private $private_a;
public static function dumpClass($class) {
print_r(get_class_vars($class));
}
}
class B extends A {
private $private_b;
}
A::dumpClass('A');
A::dumpClass('B');
Expected result:
----------------
Array
(
[private_a] =>
)
Array
(
[private_a] =>
)
Actual result:
--------------
Array
(
[private_a] =>
)
Array
(
)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=46812&edit=1