ID: 46812 Updated by: [email protected] Reported By: phpbug dot classvars at sub dot noloop dot net -Status: To be documented +Status: Closed Bug Type: Class/Object related Operating System: * PHP Version: 5.*, 6CVS (2009-04-30) New Comment:
This bug has been fixed in the documentation's XML sources. Since the online and downloadable versions of the documentation need some time to get updated, we would like to ask you to be a bit patient. Thank you for the report, and for helping us make our documentation better. Previous Comments: ------------------------------------------------------------------------ [2010-02-16 23:45:45] [email protected] Automatic comment from SVN on behalf of joey Revision: http://svn.php.net/viewvc/?view=revision&revision=295188 Log: Fix PHP Bug #46812, applying patch suggested by [email protected] ------------------------------------------------------------------------ [2009-05-22 13:21:37] [email protected] 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. ------------------------------------------------------------------------ [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] [email protected] 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
