ID: 46812 Updated by: lbarn...@php.net Reported By: phpbug dot classvars at sub dot noloop dot net -Status: Verified +Status: To be documented Bug Type: Class/Object related Operating System: * PHP Version: 5.*, 6CVS (2009-04-30) New Comment:
To be documented: - Returns an associative array of default public properties of the class. + Returns an associative array of declared properties visible from the current scope, with their default value. Previous Comments: ------------------------------------------------------------------------ [2009-04-30 14:06:12] phpbug dot classvars at sub dot noloop dot net 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 ( ) ------------------------------------------------------------------------ [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