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)#1 (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)#2 (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)#3 (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)#4 (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)#1 (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)#2 (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)#3 (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)#4 (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)#3 (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)#4 (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)#1 (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)#4 (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)#1 (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)#2 (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)#1 (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)#2 (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)#3 (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)#4 (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" }