ID: 46812 Updated by: j...@php.net Reported By: phpbug dot classvars at sub dot noloop dot net -Status: Open +Status: Feedback Bug Type: Class/Object related Operating System: Linux PHP Version: 5.2.8 New Comment:
Please try using this CVS snapshot: http://snaps.php.net/php5.2-latest.tar.gz For Windows: http://windows.php.net/snapshots/ Previous Comments: ------------------------------------------------------------------------ [2008-12-12 14:33:21] msara...@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