]> granicus.if.org Git - php/commitdiff
New foreach tests. Tested on Windows, Linux and Linux 64 bit.
authorandy wharmby <wharmby@php.net>
Sun, 14 Jun 2009 14:17:46 +0000 (14:17 +0000)
committerandy wharmby <wharmby@php.net>
Sun, 14 Jun 2009 14:17:46 +0000 (14:17 +0000)
tests/lang/foreachLoopObjects.001.phpt [new file with mode: 0644]
tests/lang/foreachLoopObjects.002.phpt [new file with mode: 0644]
tests/lang/foreachLoopObjects.003.phpt [new file with mode: 0644]
tests/lang/foreachLoopObjects.004.phpt [new file with mode: 0644]
tests/lang/foreachLoopObjects.005.phpt [new file with mode: 0644]
tests/lang/foreachLoopObjects.006.phpt [new file with mode: 0644]

diff --git a/tests/lang/foreachLoopObjects.001.phpt b/tests/lang/foreachLoopObjects.001.phpt
new file mode 100644 (file)
index 0000000..fdb9f48
--- /dev/null
@@ -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.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(1) "a"
+unicode(10) "Original a"
+unicode(1) "b"
+unicode(10) "Original b"
+unicode(1) "c"
+unicode(10) "Original c"
+
+Check key and value after the loop.
+unicode(1) "c"
+unicode(10) "Original c"
+
+
+Object instantiated inside loop.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(1) "a"
+unicode(10) "Original a"
+unicode(1) "b"
+unicode(10) "Original b"
+unicode(1) "c"
+unicode(10) "Original c"
+
+Check key and value after the loop.
+unicode(1) "c"
+unicode(10) "Original c"
\ No newline at end of file
diff --git a/tests/lang/foreachLoopObjects.002.phpt b/tests/lang/foreachLoopObjects.002.phpt
new file mode 100644 (file)
index 0000000..d093d80
--- /dev/null
@@ -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
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+
+--> Using instance of D:
+in D::doForEachOnThis
+unicode(10) "Original f"
+unicode(10) "Original g"
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(9) "changed.f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+--> Using instance of E:
+in E::doForEachOnThis
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+unicode(12) "Overridden d"
+unicode(12) "Overridden e"
+unicode(10) "Original g"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"E":private]=>
+  unicode(9) "changed.e"
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+
+Iterate over various generations from within an inherited method:
+
+--> Using instance of C:
+in C::doForEachC
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+
+--> Using instance of D:
+in C::doForEachC
+unicode(10) "Original g"
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+
+--> Using instance of E:
+in C::doForEachC
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+unicode(12) "Overridden d"
+unicode(10) "Original g"
+unicode(10) "Original e"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"E":private]=>
+  unicode(12) "Overridden e"
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+
+
+Iterate over various generations from within an overridden static method:
+
+--> Using instance of C:
+in C::doForEach
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+in D::doForEach
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+in E::doForEach
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+--> Using instance of D:
+in C::doForEach
+unicode(10) "Original g"
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+in D::doForEach
+unicode(10) "Original f"
+unicode(10) "Original g"
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(9) "changed.f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+in E::doForEach
+unicode(10) "Original g"
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+--> Using instance of E:
+in C::doForEach
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+unicode(12) "Overridden d"
+unicode(10) "Original g"
+unicode(10) "Original e"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"E":private]=>
+  unicode(12) "Overridden e"
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"e":u"C":private]=>
+  unicode(9) "changed.e"
+}
+in D::doForEach
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+unicode(12) "Overridden d"
+unicode(10) "Original f"
+unicode(10) "Original g"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"E":private]=>
+  unicode(12) "Overridden e"
+  [u"f":u"D":private]=>
+  unicode(9) "changed.f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+in E::doForEach
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+unicode(12) "Overridden d"
+unicode(12) "Overridden e"
+unicode(10) "Original g"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(9) "changed.d"
+  [u"e":u"E":private]=>
+  unicode(9) "changed.e"
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(9) "changed.g"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+
+Iterate over various generations from outside the object:
+
+--> Using instance of C:
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  &unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+--> Using instance of D:
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+object(D)#%d (7) {
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(10) "Original g"
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  &unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+--> Using instance of E:
+unicode(12) "Overridden a"
+unicode(12) "Overridden b"
+unicode(12) "Overridden c"
+object(E)#%d (8) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  &unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(12) "Overridden d"
+  [u"e":u"E":private]=>
+  unicode(12) "Overridden e"
+  [u"f":u"D":private]=>
+  unicode(10) "Original f"
+  [u"g":protected]=>
+  unicode(10) "Original g"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+===DONE===
\ No newline at end of file
diff --git a/tests/lang/foreachLoopObjects.003.phpt b/tests/lang/foreachLoopObjects.003.phpt
new file mode 100644 (file)
index 0000000..6c32507
--- /dev/null
@@ -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.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+Modifying the foreach $value.
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+Modifying the foreach &$value.
+object(C)#%d (5) {
+  [u"a"]=>
+  unicode(9) "changed.a"
+  [u"b"]=>
+  unicode(9) "changed.b"
+  [u"c"]=>
+  &unicode(9) "changed.c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+Adding properties to an an object.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(16) "Added property 0"
+unicode(16) "Added property 1"
+unicode(16) "Added property 2"
+unicode(16) "Added property 3"
+unicode(16) "Added property 4"
+unicode(16) "Added property 5"
+unicode(16) "Added property 6"
+unicode(16) "Added property 7"
+Loop detected
+object(C)#%d (17) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+  [u"new0"]=>
+  unicode(16) "Added property 0"
+  [u"new1"]=>
+  unicode(16) "Added property 1"
+  [u"new2"]=>
+  unicode(16) "Added property 2"
+  [u"new3"]=>
+  unicode(16) "Added property 3"
+  [u"new4"]=>
+  unicode(16) "Added property 4"
+  [u"new5"]=>
+  unicode(16) "Added property 5"
+  [u"new6"]=>
+  unicode(16) "Added property 6"
+  [u"new7"]=>
+  unicode(16) "Added property 7"
+  [u"new8"]=>
+  unicode(16) "Added property 8"
+  [u"new9"]=>
+  unicode(16) "Added property 9"
+  [u"new10"]=>
+  unicode(17) "Added property 10"
+  [u"new11"]=>
+  unicode(17) "Added property 11"
+}
+
+Adding properties to an an object, using &$value.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(16) "Added property 0"
+unicode(16) "Added property 1"
+unicode(16) "Added property 2"
+unicode(16) "Added property 3"
+unicode(16) "Added property 4"
+unicode(16) "Added property 5"
+unicode(16) "Added property 6"
+unicode(16) "Added property 7"
+Loop detected
+object(C)#%d (17) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+  [u"new0"]=>
+  unicode(16) "Added property 0"
+  [u"new1"]=>
+  unicode(16) "Added property 1"
+  [u"new2"]=>
+  unicode(16) "Added property 2"
+  [u"new3"]=>
+  unicode(16) "Added property 3"
+  [u"new4"]=>
+  unicode(16) "Added property 4"
+  [u"new5"]=>
+  unicode(16) "Added property 5"
+  [u"new6"]=>
+  unicode(16) "Added property 6"
+  [u"new7"]=>
+  unicode(16) "Added property 7"
+  [u"new8"]=>
+  &unicode(16) "Added property 8"
+  [u"new9"]=>
+  unicode(16) "Added property 9"
+  [u"new10"]=>
+  unicode(17) "Added property 10"
+  [u"new11"]=>
+  unicode(17) "Added property 11"
+}
+
+Removing properties from an object.
+unicode(10) "Original a"
+object(C)#%d (2) {
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+
+Removing properties from an object, using &$value.
+unicode(10) "Original a"
+object(C)#%d (2) {
+  [u"d":protected]=>
+  unicode(10) "Original d"
+  [u"e":u"C":private]=>
+  unicode(10) "Original e"
+}
+===DONE===
\ No newline at end of file
diff --git a/tests/lang/foreachLoopObjects.004.phpt b/tests/lang/foreachLoopObjects.004.phpt
new file mode 100644 (file)
index 0000000..3ca5d60
--- /dev/null
@@ -0,0 +1,54 @@
+--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.
+unicode(10) "Original a"
+unicode(10) "Original b"
+
+Notice: Undefined property: C::$b in %s on line %d
+unicode(10) "Original c"
+
+Notice: Undefined property: C::$b in %s on line %d
+unicode(10) "Original d"
+
+Notice: Undefined property: C::$b in %s on line %d
+unicode(10) "Original e"
+object(C)#%d (4) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d"]=>
+  unicode(10) "Original d"
+  [u"e"]=>
+  unicode(10) "Original e"
+}
+===DONE===
\ No newline at end of file
diff --git a/tests/lang/foreachLoopObjects.005.phpt b/tests/lang/foreachLoopObjects.005.phpt
new file mode 100644 (file)
index 0000000..318d2de
--- /dev/null
@@ -0,0 +1,79 @@
+--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);
+
+
+?>
+===DONE===
+--EXPECTF--
+Removing properties before the current element from an iterated object.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#%d (4) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"d"]=>
+  unicode(10) "Original d"
+  [u"e"]=>
+  unicode(10) "Original e"
+}
+
+Removing properties before the current element from an iterated object.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#%d (4) {
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d"]=>
+  unicode(10) "Original d"
+  [u"e"]=>
+  unicode(10) "Original e"
+}
+===DONE===
\ No newline at end of file
diff --git a/tests/lang/foreachLoopObjects.006.phpt b/tests/lang/foreachLoopObjects.006.phpt
new file mode 100644 (file)
index 0000000..9eabc74
--- /dev/null
@@ -0,0 +1,148 @@
+--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);
+
+?>
+===DONE===
+--EXPECTF--
+Substituting the iterated object for a different object.
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(5) "new a"
+unicode(5) "new b"
+unicode(5) "new c"
+unicode(5) "new d"
+unicode(5) "new e"
+unicode(5) "new f"
+object(stdClass)#%d (6) {
+  [u"a"]=>
+  unicode(5) "new a"
+  [u"b"]=>
+  unicode(5) "new b"
+  [u"c"]=>
+  unicode(5) "new c"
+  [u"d"]=>
+  unicode(5) "new d"
+  [u"e"]=>
+  unicode(5) "new e"
+  [u"f"]=>
+  unicode(5) "new f"
+}
+
+Substituting the iterated object for an array.
+unicode(10) "Original a"
+unicode(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)
+unicode(10) "Original a"
+unicode(10) "Original b"
+unicode(10) "Original c"
+unicode(10) "Original d"
+unicode(10) "Original e"
+object(C)#1 (5) {
+  [u"a"]=>
+  unicode(10) "Original a"
+  [u"b"]=>
+  unicode(10) "Original b"
+  [u"c"]=>
+  unicode(10) "Original c"
+  [u"d"]=>
+  unicode(10) "Original d"
+  [u"e"]=>
+  unicode(10) "Original e"
+}
+===DONE===
\ No newline at end of file