summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorandy wharmby <wharmby@php.net>2009-06-14 14:17:43 +0000
committerandy wharmby <wharmby@php.net>2009-06-14 14:17:43 +0000
commit1888c718cb7df189e61dc417b2adb4e27792e4b4 (patch)
tree08ca03d2664d1f2a46571e89f2ccb79129655d63 /tests
parentceca4f36152d184a3bff463c79122e4dda96a3c3 (diff)
downloadphp-git-1888c718cb7df189e61dc417b2adb4e27792e4b4.tar.gz
New foreach tests. Tested on Windows, Linux and Linux 64 bit.
Diffstat (limited to 'tests')
-rw-r--r--tests/func/foreachLoopObjects.001.phpt69
-rw-r--r--tests/func/foreachLoopObjects.002.phpt587
-rw-r--r--tests/func/foreachLoopObjects.003.phpt250
-rw-r--r--tests/func/foreachLoopObjects.004.phpt55
-rw-r--r--tests/func/foreachLoopObjects.005.phpt78
-rw-r--r--tests/func/foreachLoopObjects.006.phpt147
6 files changed, 1186 insertions, 0 deletions
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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ protected $d = "Original d";
+ private $e = "Original e";
+
+}
+
+echo "\n\nSimple loop.\n";
+$obj = new C;
+foreach ($obj as $v) {
+ var_dump($v);
+}
+foreach ($obj as $k => $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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ protected $d = "Original d";
+ private $e = "Original e";
+
+ function doForEachC() {
+ echo "in C::doForEachC\n";
+ foreach ($this as $k=>&$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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ protected $d = "Original d";
+ private $e = "Original e";
+}
+
+echo "\nDirectly changing object values.\n";
+$obj = new C;
+foreach ($obj as $k=>$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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ public $d = "Original d";
+ public $e = "Original e";
+}
+
+echo "\nRemoving the current element from an iterated object.\n";
+$obj = new C;
+$count=0;
+foreach ($obj as $v) {
+ if ($v==$obj->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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ public $d = "Original d";
+ public $e = "Original e";
+}
+
+echo "\nRemoving properties before the current element from an iterated object.\n";
+$obj = new C;
+$count=0;
+foreach ($obj as $v) {
+ if ($v==$obj->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--
+<?php
+
+class C {
+ public $a = "Original a";
+ public $b = "Original b";
+ public $c = "Original c";
+ public $d = "Original d";
+ public $e = "Original e";
+}
+
+echo "\nSubstituting the iterated object for a different object.\n";
+$obj = new C;
+$obj2 = new stdclass;
+$obj2->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"
+}