summaryrefslogtreecommitdiff
path: root/tests/lang/foreachLoopObjects.002.phpt
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lang/foreachLoopObjects.002.phpt')
-rw-r--r--tests/lang/foreachLoopObjects.002.phpt587
1 files changed, 587 insertions, 0 deletions
diff --git a/tests/lang/foreachLoopObjects.002.phpt b/tests/lang/foreachLoopObjects.002.phpt
new file mode 100644
index 0000000..0b06f2b
--- /dev/null
+++ b/tests/lang/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