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

Reply via email to