--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); ?> --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 a" string(10) "Original b" string(10) "Original c" string(10) "Original d" string(10) "Original f" string(10) "Original g" object(D)#%d (7) { ["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" ["f":"D":private]=> string(9) "changed.f" ["g":protected]=> string(9) "changed.g" } --> Using instance of E: in E::doForEachOnThis string(12) "Overridden a" string(12) "Overridden b" string(12) "Overridden c" string(12) "Overridden d" string(10) "Original g" string(12) "Overridden 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":"C":private]=> string(10) "Original e" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" ["e":"E":private]=> string(9) "changed.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 a" string(10) "Original b" string(10) "Original c" string(10) "Original d" string(10) "Original e" string(10) "Original g" object(D)#%d (7) { ["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" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" } --> 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 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":"C":private]=> string(9) "changed.e" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" ["e":"E":private]=> string(12) "Overridden 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 a" string(10) "Original b" string(10) "Original c" string(10) "Original d" string(10) "Original e" string(10) "Original g" object(D)#%d (7) { ["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" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" } in D::doForEach string(10) "Original a" string(10) "Original b" string(10) "Original c" string(10) "Original d" string(10) "Original f" string(10) "Original g" object(D)#%d (7) { ["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" ["f":"D":private]=> string(9) "changed.f" ["g":protected]=> string(9) "changed.g" } in E::doForEach string(10) "Original a" string(10) "Original b" string(10) "Original c" string(10) "Original d" string(10) "Original g" object(D)#%d (7) { ["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" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" } --> 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 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":"C":private]=> string(9) "changed.e" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" ["e":"E":private]=> string(12) "Overridden 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":"C":private]=> string(10) "Original e" ["f":"D":private]=> string(9) "changed.f" ["g":protected]=> string(9) "changed.g" ["e":"E":private]=> string(12) "Overridden e" } in E::doForEach string(12) "Overridden a" string(12) "Overridden b" string(12) "Overridden c" string(12) "Overridden d" string(10) "Original g" string(12) "Overridden 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":"C":private]=> string(10) "Original e" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(9) "changed.g" ["e":"E":private]=> string(9) "changed.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) { ["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" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(10) "Original g" } --> 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":"C":private]=> string(10) "Original e" ["f":"D":private]=> string(10) "Original f" ["g":protected]=> string(10) "Original g" ["e":"E":private]=> string(12) "Overridden e" }