From: andy wharmby Date: Sun, 14 Jun 2009 14:17:43 +0000 (+0000) Subject: New foreach tests. Tested on Windows, Linux and Linux 64 bit. X-Git-Tag: php-5.3.0RC4~65 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1888c718cb7df189e61dc417b2adb4e27792e4b4;p=php New foreach tests. Tested on Windows, Linux and Linux 64 bit. --- diff --git a/tests/func/foreachLoopObjects.001.phpt b/tests/func/foreachLoopObjects.001.phpt new file mode 100644 index 0000000000..e6047b77e3 --- /dev/null +++ b/tests/func/foreachLoopObjects.001.phpt @@ -0,0 +1,69 @@ +--TEST-- +Foreach loop on objects - basic loop with just value and key => value. +--FILE-- + $v) { + var_dump($k, $v); +} +echo "\nCheck key and value after the loop.\n"; +var_dump($k, $v); + + +echo "\n\nObject instantiated inside loop.\n"; +foreach (new C as $v) { + var_dump($v); +} +foreach (new C as $k => $v) { + var_dump($k, $v); +} +echo "\nCheck key and value after the loop.\n"; +var_dump($k, $v); +?> +--EXPECTF-- + + +Simple loop. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(1) "a" +string(10) "Original a" +string(1) "b" +string(10) "Original b" +string(1) "c" +string(10) "Original c" + +Check key and value after the loop. +string(1) "c" +string(10) "Original c" + + +Object instantiated inside loop. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(1) "a" +string(10) "Original a" +string(1) "b" +string(10) "Original b" +string(1) "c" +string(10) "Original c" + +Check key and value after the loop. +string(1) "c" +string(10) "Original c" \ No newline at end of file diff --git a/tests/func/foreachLoopObjects.002.phpt b/tests/func/foreachLoopObjects.002.phpt new file mode 100644 index 0000000000..0b06f2b740 --- /dev/null +++ b/tests/func/foreachLoopObjects.002.phpt @@ -0,0 +1,587 @@ +--TEST-- +Foreach loop tests - visibility. +--FILE-- +&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + static function doForEach($obj) { + echo "in C::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in C::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + +} + +class D extends C { + + private $f = "Original f"; + protected $g = "Original g"; + + static function doForEach($obj) { + echo "in D::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in D::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } +} + +class E extends D { + public $a = "Overridden a"; + public $b = "Overridden b"; + public $c = "Overridden c"; + protected $d = "Overridden d"; + private $e = "Overridden e"; + + static function doForEach($obj) { + echo "in E::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in E::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } +} + +echo "\n\nIterate over various generations from within overridden methods:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +$myC->doForEachOnThis(); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +$myD->doForEachOnThis(); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +$myE->doForEachOnThis(); +var_dump($myE); + +echo "\n\nIterate over various generations from within an inherited method:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +$myC->doForEachC(); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +$myD->doForEachC(); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +$myE->doForEachC(); +var_dump($myE); + +echo "\n\nIterate over various generations from within an overridden static method:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +C::doForEach($myC); +var_dump($myC); +$myC = new C; +D::doForEach($myC); +var_dump($myC); +$myC = new C; +E::doForEach($myC); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +C::doForEach($myD); +var_dump($myD); +$myD = new D; +D::doForEach($myD); +var_dump($myD); +$myD = new D; +E::doForEach($myD); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +C::doForEach($myE); +var_dump($myE); +$myE = new E; +D::doForEach($myE); +var_dump($myE); +$myE = new E; +E::doForEach($myE); +var_dump($myE); + + +echo "\n\nIterate over various generations from outside the object:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +foreach ($myC as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +foreach ($myD as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +foreach ($myE as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myE); +?> +===DONE=== +--EXPECTF-- +Iterate over various generations from within overridden methods: + +--> Using instance of C: +in C::doForEachOnThis +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(9) "changed.e" +} + +--> Using instance of D: +in D::doForEachOnThis +string(10) "Original f" +string(10) "Original g" +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +object(D)#%d (7) { + ["f":"D":private]=> + string(9) "changed.f" + ["g":protected]=> + string(9) "changed.g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(10) "Original e" +} + +--> Using instance of E: +in E::doForEachOnThis +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +string(12) "Overridden d" +string(12) "Overridden e" +string(10) "Original g" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"E":private]=> + string(9) "changed.e" + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["e":"C":private]=> + string(10) "Original e" +} + + +Iterate over various generations from within an inherited method: + +--> Using instance of C: +in C::doForEachC +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(9) "changed.e" +} + +--> Using instance of D: +in C::doForEachC +string(10) "Original g" +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(D)#%d (7) { + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(9) "changed.e" +} + +--> Using instance of E: +in C::doForEachC +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +string(12) "Overridden d" +string(10) "Original g" +string(10) "Original e" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"E":private]=> + string(12) "Overridden e" + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["e":"C":private]=> + string(9) "changed.e" +} + + +Iterate over various generations from within an overridden static method: + +--> Using instance of C: +in C::doForEach +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(9) "changed.e" +} +in D::doForEach +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(10) "Original e" +} +in E::doForEach +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(10) "Original e" +} + +--> Using instance of D: +in C::doForEach +string(10) "Original g" +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(D)#%d (7) { + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(9) "changed.e" +} +in D::doForEach +string(10) "Original f" +string(10) "Original g" +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +object(D)#%d (7) { + ["f":"D":private]=> + string(9) "changed.f" + ["g":protected]=> + string(9) "changed.g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(10) "Original e" +} +in E::doForEach +string(10) "Original g" +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +object(D)#%d (7) { + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"C":private]=> + string(10) "Original e" +} + +--> Using instance of E: +in C::doForEach +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +string(12) "Overridden d" +string(10) "Original g" +string(10) "Original e" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"E":private]=> + string(12) "Overridden e" + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["e":"C":private]=> + string(9) "changed.e" +} +in D::doForEach +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +string(12) "Overridden d" +string(10) "Original f" +string(10) "Original g" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"E":private]=> + string(12) "Overridden e" + ["f":"D":private]=> + string(9) "changed.f" + ["g":protected]=> + string(9) "changed.g" + ["e":"C":private]=> + string(10) "Original e" +} +in E::doForEach +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +string(12) "Overridden d" +string(12) "Overridden e" +string(10) "Original g" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(9) "changed.d" + ["e":"E":private]=> + string(9) "changed.e" + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(9) "changed.g" + ["e":"C":private]=> + string(10) "Original e" +} + + +Iterate over various generations from outside the object: + +--> Using instance of C: +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + &string(9) "changed.c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +--> Using instance of D: +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +object(D)#%d (7) { + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(10) "Original g" + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + &string(9) "changed.c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +--> Using instance of E: +string(12) "Overridden a" +string(12) "Overridden b" +string(12) "Overridden c" +object(E)#%d (8) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + &string(9) "changed.c" + ["d":protected]=> + string(12) "Overridden d" + ["e":"E":private]=> + string(12) "Overridden e" + ["f":"D":private]=> + string(10) "Original f" + ["g":protected]=> + string(10) "Original g" + ["e":"C":private]=> + string(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/func/foreachLoopObjects.003.phpt b/tests/func/foreachLoopObjects.003.phpt new file mode 100644 index 0000000000..e3747bf71f --- /dev/null +++ b/tests/func/foreachLoopObjects.003.phpt @@ -0,0 +1,250 @@ +--TEST-- +Foreach loop tests - modifying the object during the loop. +--FILE-- +$v) { + $obj->$k="changed.$k"; + var_dump($v); +} +var_dump($obj); + +echo "\nModifying the foreach \$value.\n"; +$obj = new C; +foreach ($obj as $k=>$v) { + $v="changed.$k"; +} +var_dump($obj); + + +echo "\nModifying the foreach &\$value.\n"; +$obj = new C; +foreach ($obj as $k=>&$v) { + $v="changed.$k"; +} +var_dump($obj); + +echo "\nAdding properties to an an object.\n"; +$obj = new C; +$counter=0; +foreach ($obj as $v) { + $newPropName = "new$counter"; + $obj->$newPropName = "Added property $counter"; + if ($counter++>10) { + echo "Loop detected\n"; + break; + } + var_dump($v); +} +var_dump($obj); + +echo "\nAdding properties to an an object, using &\$value.\n"; +$obj = new C; +$counter=0; +foreach ($obj as &$v) { + $newPropName = "new$counter"; + $obj->$newPropName = "Added property $counter"; + if ($counter++>10) { + echo "Loop detected\n"; + break; + } + var_dump($v); +} +var_dump($obj); + +echo "\nRemoving properties from an object.\n"; +$obj = new C; +foreach ($obj as $v) { + unset($obj->a); + unset($obj->b); + unset($obj->c); + var_dump($v); +} +var_dump($obj); + +echo "\nRemoving properties from an object, using &\$value.\n"; +$obj = new C; +foreach ($obj as &$v) { + unset($obj->a); + unset($obj->b); + unset($obj->c); + var_dump($v); +} +var_dump($obj); + +?> +===DONE=== +--EXPECTF-- +Directly changing object values. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + string(9) "changed.c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +Modifying the foreach $value. +object(C)#%d (5) { + ["a"]=> + string(10) "Original a" + ["b"]=> + string(10) "Original b" + ["c"]=> + string(10) "Original c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +Modifying the foreach &$value. +object(C)#%d (5) { + ["a"]=> + string(9) "changed.a" + ["b"]=> + string(9) "changed.b" + ["c"]=> + &string(9) "changed.c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +Adding properties to an an object. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(16) "Added property 0" +string(16) "Added property 1" +string(16) "Added property 2" +string(16) "Added property 3" +string(16) "Added property 4" +string(16) "Added property 5" +string(16) "Added property 6" +string(16) "Added property 7" +Loop detected +object(C)#%d (17) { + ["a"]=> + string(10) "Original a" + ["b"]=> + string(10) "Original b" + ["c"]=> + string(10) "Original c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" + ["new0"]=> + string(16) "Added property 0" + ["new1"]=> + string(16) "Added property 1" + ["new2"]=> + string(16) "Added property 2" + ["new3"]=> + string(16) "Added property 3" + ["new4"]=> + string(16) "Added property 4" + ["new5"]=> + string(16) "Added property 5" + ["new6"]=> + string(16) "Added property 6" + ["new7"]=> + string(16) "Added property 7" + ["new8"]=> + string(16) "Added property 8" + ["new9"]=> + string(16) "Added property 9" + ["new10"]=> + string(17) "Added property 10" + ["new11"]=> + string(17) "Added property 11" +} + +Adding properties to an an object, using &$value. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(16) "Added property 0" +string(16) "Added property 1" +string(16) "Added property 2" +string(16) "Added property 3" +string(16) "Added property 4" +string(16) "Added property 5" +string(16) "Added property 6" +string(16) "Added property 7" +Loop detected +object(C)#%d (17) { + ["a"]=> + string(10) "Original a" + ["b"]=> + string(10) "Original b" + ["c"]=> + string(10) "Original c" + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" + ["new0"]=> + string(16) "Added property 0" + ["new1"]=> + string(16) "Added property 1" + ["new2"]=> + string(16) "Added property 2" + ["new3"]=> + string(16) "Added property 3" + ["new4"]=> + string(16) "Added property 4" + ["new5"]=> + string(16) "Added property 5" + ["new6"]=> + string(16) "Added property 6" + ["new7"]=> + string(16) "Added property 7" + ["new8"]=> + &string(16) "Added property 8" + ["new9"]=> + string(16) "Added property 9" + ["new10"]=> + string(17) "Added property 10" + ["new11"]=> + string(17) "Added property 11" +} + +Removing properties from an object. +string(10) "Original a" +object(C)#%d (2) { + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} + +Removing properties from an object, using &$value. +string(10) "Original a" +object(C)#%d (2) { + ["d":protected]=> + string(10) "Original d" + ["e":"C":private]=> + string(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/func/foreachLoopObjects.004.phpt b/tests/func/foreachLoopObjects.004.phpt new file mode 100644 index 0000000000..a158ac62d1 --- /dev/null +++ b/tests/func/foreachLoopObjects.004.phpt @@ -0,0 +1,55 @@ +--TEST-- +Foreach loop tests - Removing the current element from an iterated object. +--FILE-- +b) { + unset($obj->b); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + + +?> +===DONE=== +--EXPECTF-- +Removing the current element from an iterated object. +string(10) "Original a" +string(10) "Original b" + +Notice: Undefined property: C::$b in %s on line %d +string(10) "Original c" + +Notice: Undefined property: C::$b in %s on line %d +string(10) "Original d" + +Notice: Undefined property: C::$b in %s on line %d +string(10) "Original e" +object(C)#%d (4) { + ["a"]=> + string(10) "Original a" + ["c"]=> + string(10) "Original c" + ["d"]=> + string(10) "Original d" + ["e"]=> + string(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/func/foreachLoopObjects.005.phpt b/tests/func/foreachLoopObjects.005.phpt new file mode 100644 index 0000000000..1692bcd2fc --- /dev/null +++ b/tests/func/foreachLoopObjects.005.phpt @@ -0,0 +1,78 @@ +--TEST-- +Foreach loop tests - removing properties before and after the current property during the loop. +--FILE-- +a) { + unset($obj->c); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nRemoving properties before the current element from an iterated object.\n"; +$obj = new C; +foreach ($obj as $v) { + if ($v==$obj->b) { + unset($obj->a); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + + +?> +--EXPECTF-- + +Removing properties before the current element from an iterated object. +string(10) "Original a" +string(10) "Original b" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (4) { + ["a"]=> + string(10) "Original a" + ["b"]=> + string(10) "Original b" + ["d"]=> + string(10) "Original d" + ["e"]=> + string(10) "Original e" +} + +Removing properties before the current element from an iterated object. +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (4) { + ["b"]=> + string(10) "Original b" + ["c"]=> + string(10) "Original c" + ["d"]=> + string(10) "Original d" + ["e"]=> + string(10) "Original e" +} diff --git a/tests/func/foreachLoopObjects.006.phpt b/tests/func/foreachLoopObjects.006.phpt new file mode 100644 index 0000000000..8218b44dab --- /dev/null +++ b/tests/func/foreachLoopObjects.006.phpt @@ -0,0 +1,147 @@ +--TEST-- +Foreach loop tests - substituting the entire iterated entity during the loop. +--FILE-- +a = "new a"; +$obj2->b = "new b"; +$obj2->c = "new c"; +$obj2->d = "new d"; +$obj2->e = "new e"; +$obj2->f = "new f"; +$ref = &$obj; +$count=0; +foreach ($obj as $v) { + var_dump($v); + if ($v==$obj->b) { + $ref=$obj2; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nSubstituting the iterated object for an array.\n"; +$obj = new C; +$a = array(1,2,3,4,5,6,7,8); +$ref = &$obj; +$count=0; +foreach ($obj as $v) { + var_dump($v); + if ($v==="Original b") { + $ref=$a; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nSubstituting the iterated array for an object.\n"; +$a = array(1,2,3,4,5,6,7,8); +$obj = new C; +$ref = &$a; +$count=0; +foreach ($a as $v) { + var_dump($v); + if ($v===2) { + $ref=$obj; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +?> +--EXPECTF-- + +Substituting the iterated object for a different object. +string(10) "Original a" +string(10) "Original b" +string(5) "new a" +string(5) "new b" +string(5) "new c" +string(5) "new d" +string(5) "new e" +string(5) "new f" +object(stdClass)#%d (6) { + ["a"]=> + string(5) "new a" + ["b"]=> + string(5) "new b" + ["c"]=> + string(5) "new c" + ["d"]=> + string(5) "new d" + ["e"]=> + string(5) "new e" + ["f"]=> + string(5) "new f" +} + +Substituting the iterated object for an array. +string(10) "Original a" +string(10) "Original b" +int(1) +int(2) +int(3) +int(4) +int(5) +int(6) +int(7) +int(8) +array(8) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + [7]=> + int(8) +} + +Substituting the iterated array for an object. +int(1) +int(2) +string(10) "Original a" +string(10) "Original b" +string(10) "Original c" +string(10) "Original d" +string(10) "Original e" +object(C)#%d (5) { + ["a"]=> + string(10) "Original a" + ["b"]=> + string(10) "Original b" + ["c"]=> + string(10) "Original c" + ["d"]=> + string(10) "Original d" + ["e"]=> + string(10) "Original e" +}