get_class_vars() does not include visible private variable looking at subclass
| Bug #46812 | get_class_vars() does not include visible private variable looking at subclass | ||||
|---|---|---|---|---|---|
| Submitted: | 2008-12-09 10:13 UTC | Modified: | 2010-02-16 23:48 UTC | ||
| From: | phpbug dot classvars at sub dot noloop dot net | Assigned: | |||
| Status: | Closed | Package: | Class/Object related | ||
| PHP Version: | 5.*, 6CVS (2009-04-30) | OS: | * | ||
| Private report: | No | CVE-ID: | None | ||
[2008-12-09 10:13 UTC] 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 ( )
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2008-12-12 14:33 UTC] 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); } } }[2009-04-30 14:06 UTC] phpbug dot classvars at sub dot noloop dot net
[2009-05-22 13:21 UTC] lbarnaud@php.net
[2010-02-16 23:48 UTC] joey@php.net