ID: 46812
Updated by: [email protected]
Reported By: phpbug dot classvars at sub dot noloop dot net
Status: Open
Bug Type: Class/Object related
Operating System: Linux
PHP Version: 5.2.8
New Comment:
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);
}
}
}
Previous Comments:
------------------------------------------------------------------------
[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