Skip to content

Commit bff681c

Browse files
committed
Handle dynamic props more gracefully in hooked obj iter
Possibly buggy, not tested well yet.
1 parent 5e77cad commit bff681c

File tree

5 files changed

+195
-63
lines changed

5 files changed

+195
-63
lines changed

Zend/tests/property_hooks/foreach.phpt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ foreach over hooked properties
33
--FILE--
44
<?php
55

6+
#[AllowDynamicProperties]
67
class ByRef {
78
public $plain = 'plain';
89
private $_virtualByRef = 'virtualByRef';
@@ -16,8 +17,12 @@ class ByRef {
1617
$this->_virtualByRef = $value;
1718
}
1819
}
20+
public function __construct() {
21+
$this->dynamic = 'dynamic';
22+
}
1923
}
2024

25+
#[AllowDynamicProperties]
2126
class ByVal extends ByRef {
2227
private $_virtualByVal = 'virtualByVal';
2328
public $virtualByVal {
@@ -58,6 +63,7 @@ function testByRef($object) {
5863
echo "$prop => $value\n";
5964
$value = strtoupper($value);
6065
}
66+
unset($value);
6167
var_dump($object);
6268
}
6369

@@ -74,7 +80,7 @@ testByVal(new ByRef);
7480
testByRef(new ByRef);
7581

7682
?>
77-
--EXPECT--
83+
--EXPECTF--
7884
ByVal::$virtualByVal::get
7985
virtualByVal => virtualByVal
8086
ByVal::$virtualByVal::set
@@ -88,7 +94,8 @@ plain => plain
8894
ByRef::$virtualByRef::get
8995
virtualByRef => virtualByRef
9096
ByRef::$virtualByRef::set
91-
object(ByVal)#1 (5) {
97+
dynamic => dynamic
98+
object(ByVal)#%d (6) {
9299
["plain"]=>
93100
string(5) "PLAIN"
94101
["_virtualByRef":"ByRef":private]=>
@@ -99,23 +106,31 @@ object(ByVal)#1 (5) {
99106
string(6) "BACKED"
100107
["backedUninitialized"]=>
101108
string(19) "BACKEDUNINITIALIZED"
109+
["dynamic"]=>
110+
string(7) "DYNAMIC"
102111
}
103112
plain => plain
104113
ByRef::$virtualByRef::get
105114
virtualByRef => virtualByRef
106115
ByRef::$virtualByRef::set
107-
object(ByRef)#1 (2) {
116+
dynamic => dynamic
117+
object(ByRef)#%d (3) {
108118
["plain"]=>
109119
string(5) "PLAIN"
110120
["_virtualByRef":"ByRef":private]=>
111121
string(12) "VIRTUALBYREF"
122+
["dynamic"]=>
123+
string(7) "DYNAMIC"
112124
}
113125
plain => plain
114126
ByRef::$virtualByRef::get
115127
virtualByRef => virtualByRef
116-
object(ByRef)#1 (2) {
128+
dynamic => dynamic
129+
object(ByRef)#%d (3) {
117130
["plain"]=>
118131
string(5) "PLAIN"
119132
["_virtualByRef":"ByRef":private]=>
120-
&string(12) "VIRTUALBYREF"
133+
string(12) "VIRTUALBYREF"
134+
["dynamic"]=>
135+
string(7) "DYNAMIC"
121136
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
foreach over hooked properties
3+
--FILE--
4+
<?php
5+
6+
class A extends stdClass {
7+
public $foo {
8+
&get => $this->foo;
9+
}
10+
}
11+
12+
$a = new A;
13+
foreach ($a as $k => &$v) {
14+
if ($k == "foo") {
15+
$a->bar = "baz";
16+
}
17+
var_dump($k);
18+
}
19+
20+
?>
21+
--EXPECT--
22+
string(3) "foo"
23+
string(3) "bar"

0 commit comments

Comments
 (0)