mirror of
https://github.com/php/php-src.git
synced 2024-11-24 18:34:21 +08:00
Fixed bug #40757 (get_object_vars get nothing in child class)
Fixed bug #41929 (Foreach on object does not iterate over all visible properties)
This commit is contained in:
parent
c96c5ca91f
commit
7ec48cb37f
3
NEWS
3
NEWS
@ -76,6 +76,8 @@ PHP NEWS
|
||||
from class hierarchy). (robin_fernandes at uk dot ibm dot com)
|
||||
- Fixed bug #41947 (SimpleXML incorrectly registers empty strings as
|
||||
namespaces). (Rob)
|
||||
- Fixed bug #41929 (Foreach on object does not iterate over all visible
|
||||
properties). (Dmitry)
|
||||
- Fixed bug #41919 (crash in string to array conversion).
|
||||
(judas dot iscariote at gmail dot com, Ilia)
|
||||
- Fixed bug #41908 (CFLAGS="-Os" ./configure --enable-debug fails).
|
||||
@ -160,6 +162,7 @@ PHP NEWS
|
||||
on Windows). (Scott, Andrey)
|
||||
- Fixed bug #41127 (Memory leak in ldap_{first|next}_attribute functions).
|
||||
(Jani)
|
||||
- Fixed bug #40757 (get_object_vars get nothing in child class). (Dmitry)
|
||||
- Fixed bug #40419 (Trailing slash in CGI request does not work). (Dmitry)
|
||||
- Fixed bug #39330 (apache2handler does not call shutdown actions before
|
||||
apache child die). (isk at ecommerce dot com, Gopal, Tony)
|
||||
|
@ -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) {
|
||||
|
28
Zend/tests/bug40757.phpt
Executable file
28
Zend/tests/bug40757.phpt
Executable file
@ -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
Executable file
24
Zend/tests/bug41929.phpt
Executable file
@ -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
|
@ -789,7 +789,7 @@ ZEND_FUNCTION(get_object_vars)
|
||||
char *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();
|
||||
@ -808,7 +808,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);
|
||||
|
||||
@ -816,17 +816,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) == HASH_KEY_IS_STRING) {
|
||||
if (key[0]) {
|
||||
if (zend_check_property_access(zobj, key, key_len-1 TSRMLS_CC) == SUCCESS) {
|
||||
zend_unmangle_property_name(key, key_len-1, &class_name, &prop_name);
|
||||
/* Not separating references */
|
||||
(*value)->refcount++;
|
||||
add_assoc_zval_ex(return_value, key, key_len, *value);
|
||||
} else if (instanceof) {
|
||||
zend_unmangle_property_name(key, key_len-1, &class_name, &prop_name);
|
||||
if (!memcmp(class_name, "*", 2) || (Z_OBJCE_P(EG(This)) == Z_OBJCE_PP(obj) && !strcmp(Z_OBJCE_P(EG(This))->name, class_name))) {
|
||||
/* Not separating references */
|
||||
(*value)->refcount++;
|
||||
add_assoc_zval_ex(return_value, prop_name, strlen(prop_name)+1, *value);
|
||||
}
|
||||
add_assoc_zval_ex(return_value, prop_name, strlen(prop_name)+1, *value);
|
||||
}
|
||||
}
|
||||
zend_hash_move_forward_ex(properties, &pos);
|
||||
|
@ -152,7 +152,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;
|
||||
|
@ -179,9 +179,9 @@ array(4) {
|
||||
===INSERT===
|
||||
TestBase::serialize() = 'a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
|
||||
TestDerived::serialize()
|
||||
TestBase::serialize() = 'a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}'
|
||||
TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
|
||||
TestDerived::serialize()
|
||||
TestBase::serialize() = 'a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}'
|
||||
TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
|
||||
===DATA===
|
||||
array(4) {
|
||||
[0]=>
|
||||
@ -189,9 +189,9 @@ array(4) {
|
||||
[1]=>
|
||||
string(91) "a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
|
||||
[2]=>
|
||||
string(144) "a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
|
||||
string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
|
||||
[3]=>
|
||||
string(144) "a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
|
||||
string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
|
||||
}
|
||||
===FAILURE===
|
||||
Exception:SQLSTATE[HY000]: General error: cannot unserialize class
|
||||
@ -211,22 +211,22 @@ array(3) {
|
||||
["name"]=>
|
||||
string(11) "TestDerived"
|
||||
["val"]=>
|
||||
string(144) "a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
|
||||
string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
|
||||
}
|
||||
[2]=>
|
||||
array(2) {
|
||||
["name"]=>
|
||||
NULL
|
||||
["val"]=>
|
||||
string(144) "a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";}"
|
||||
string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
|
||||
}
|
||||
}
|
||||
===FETCHCLASS===
|
||||
TestBase::unserialize(a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
|
||||
TestDerived::unserialize()
|
||||
TestBase::unserialize(a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";})
|
||||
TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
|
||||
TestDerived::unserialize()
|
||||
TestBase::unserialize(a:4:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";})
|
||||
TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
|
||||
array(3) {
|
||||
[0]=>
|
||||
object(TestBase)#%d (3) {
|
||||
@ -250,7 +250,7 @@ array(3) {
|
||||
["DerivedPri:private"]=>
|
||||
string(7) "Private"
|
||||
["BasePri:private"]=>
|
||||
string(7) "Private"
|
||||
string(8) "#Private"
|
||||
}
|
||||
[2]=>
|
||||
object(TestLeaf)#%d (6) {
|
||||
@ -265,6 +265,6 @@ array(3) {
|
||||
["DerivedPri:private"]=>
|
||||
string(7) "Private"
|
||||
["BasePri:private"]=>
|
||||
string(7) "Private"
|
||||
string(8) "#Private"
|
||||
}
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ d=>4
|
||||
===derived::function===
|
||||
a=>1
|
||||
b=>2
|
||||
c=>3
|
||||
d=>4
|
||||
===derived,foreach===
|
||||
a=>1
|
||||
|
Loading…
Reference in New Issue
Block a user