Browse Source

Fixed bug #40757 (get_object_vars get nothing in child class)

Fixed bug #41929 (Foreach on object does not iterate over all visible properties)
PHAR_1_2
Dmitry Stogov 19 years ago
parent
commit
92d3bc0c93
  1. 8
      Zend/tests/bug27798.phpt
  2. 28
      Zend/tests/bug40757.phpt
  3. 24
      Zend/tests/bug41929.phpt
  4. 18
      Zend/zend_builtin_functions.c
  5. 2
      Zend/zend_object_handlers.c
  6. 1
      tests/classes/visibility_005.phpt

8
Zend/tests/bug27798.phpt

@ -49,12 +49,12 @@ array(1) {
}
Base::__construct
array(3) {
["Baz"]=>
int(4)
["Foo"]=>
int(1)
["Bar"]=>
int(2)
["Baz"]=>
int(3)
}
Child::__construct
array(3) {
@ -86,12 +86,12 @@ array(1) {
}
Base::__construct
array(3) {
[u"Baz"]=>
int(4)
[u"Foo"]=>
int(1)
[u"Bar"]=>
int(2)
[u"Baz"]=>
int(3)
}
Child::__construct
array(3) {

28
Zend/tests/bug40757.phpt

@ -0,0 +1,28 @@
--TEST--
Bug #40757 (get_object_vars() get nothing in child class)
--FILE--
<?php
class Base {
private $p1='sadf';
function getFields($obj){
return get_object_vars($obj);
}
}
class Child extends Base { }
$base=new Base();
print_r($base->getFields(new Base()));
$child=new Child();
print_r($child->getFields(new Base()));
?>
--EXPECT--
Array
(
[p1] => sadf
)
Array
(
[p1] => sadf
)

24
Zend/tests/bug41929.phpt

@ -0,0 +1,24 @@
--TEST--
Bug #41929 Foreach on object does not iterate over all visible properties
--FILE--
<?php
class C {
private $priv = "ok";
function doLoop() {
echo $this->priv,"\n";
foreach ($this as $k=>$v) {
echo "$k: $v\n";
}
}
}
class D extends C {
}
$myD = new D;
$myD->doLoop();
?>
--EXPECT--
ok
priv: ok

18
Zend/zend_builtin_functions.c

@ -816,7 +816,7 @@ ZEND_FUNCTION(get_object_vars)
zstr key, prop_name, class_name;
uint key_len;
ulong num_index;
int instanceof;
zend_object *zobj;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &obj) == FAILURE) {
ZEND_WRONG_PARAM_COUNT();
@ -835,7 +835,7 @@ ZEND_FUNCTION(get_object_vars)
RETURN_FALSE;
}
instanceof = EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), Z_OBJCE_PP(obj) TSRMLS_CC);
zobj = zend_objects_get_address(*obj TSRMLS_CC);
array_init(return_value);
@ -843,19 +843,11 @@ ZEND_FUNCTION(get_object_vars)
while (zend_hash_get_current_data_ex(properties, (void **) &value, &pos) == SUCCESS) {
if (zend_hash_get_current_key_ex(properties, &key, &key_len, &num_index, 0, &pos) == (UG(unicode)?HASH_KEY_IS_UNICODE:HASH_KEY_IS_STRING)) {
zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, key, key_len-1, &class_name, &prop_name);
if (class_name.v == NULL) {
if (zend_check_property_access(zobj, ZEND_STR_TYPE, key, key_len-1 TSRMLS_CC) == SUCCESS) {
zend_u_unmangle_property_name(ZEND_STR_TYPE, key, key_len-1, &class_name, &prop_name);
/* Not separating references */
(*value)->refcount++;
add_u_assoc_zval_ex(return_value, UG(unicode)?IS_UNICODE:IS_STRING, key, key_len, *value);
} else if (instanceof) {
if (class_name.s[0] == '*' ||
(Z_OBJCE_P(EG(This)) == Z_OBJCE_PP(obj) &&
UG(unicode)?!u_strcmp(Z_OBJCE_P(EG(This))->name.u, class_name.u):!strcmp(Z_OBJCE_P(EG(This))->name.s, class_name.s))) {
/* Not separating references */
(*value)->refcount++;
add_u_assoc_zval(return_value, UG(unicode)?IS_UNICODE:IS_STRING, prop_name, *value);
}
add_u_assoc_zval(return_value, ZEND_STR_TYPE, prop_name, *value);
}
}
zend_hash_move_forward_ex(properties, &pos);

2
Zend/zend_object_handlers.c

@ -164,7 +164,7 @@ static int zend_verify_property_access(zend_property_info *property_info, zend_c
case ZEND_ACC_PROTECTED:
return zend_check_protected(property_info->ce, EG(scope));
case ZEND_ACC_PRIVATE:
if (ce==EG(scope) && EG(scope)) {
if ((ce==EG(scope) || property_info->ce == EG(scope)) && EG(scope)) {
return 1;
} else {
return 0;

1
tests/classes/visibility_005.phpt

@ -52,6 +52,7 @@ d=>4
===derived::function===
a=>1
b=>2
c=>3
d=>4
===derived,foreach===
a=>1

Loading…
Cancel
Save