--TEST-- foreach with nested iteratorAggregates --FILE-- " . __METHOD__ . " ($this->pos)\n"; return $this->pos<3; } public function next() { global $indent; echo "$indent--> " . __METHOD__ . " ($this->pos)\n"; return $this->myContent[$this->pos++]; } public function rewind() { global $indent; echo "$indent--> " . __METHOD__ . " ($this->pos)\n"; $this->pos=0; } public function current() { global $indent; echo "$indent--> " . __METHOD__ . " ($this->pos)\n"; return $this->myContent[$this->pos]; } public function key() { global $indent; echo "$indent--> " . __METHOD__ . " ($this->pos)\n"; return "meal " . $this->pos; } } class A1 implements IteratorAggregate { function getIterator() { return new EnglishMealIterator; } } class A2 implements IteratorAggregate { function getIterator() { return new A1; } } class A3 implements IteratorAggregate { function getIterator() { return new A2; } } echo "\n-----( A1: )-----\n"; foreach (new A1 as $k=>$v) { echo "$k => $v\n"; } echo "\n-----( A2: )-----\n"; foreach (new A2 as $k=>$v) { echo "$k => $v\n"; } echo "\n-----( A3: )-----\n"; foreach (new A3 as $k=>$v) { echo "$k => $v\n"; } ?> ===DONE=== --EXPECTF-- -----( A1: )----- --> EnglishMealIterator::rewind (0) --> EnglishMealIterator::valid (0) --> EnglishMealIterator::current (0) --> EnglishMealIterator::key (0) meal 0 => breakfast --> EnglishMealIterator::next (0) --> EnglishMealIterator::valid (1) --> EnglishMealIterator::current (1) --> EnglishMealIterator::key (1) meal 1 => dinner --> EnglishMealIterator::next (1) --> EnglishMealIterator::valid (2) --> EnglishMealIterator::current (2) --> EnglishMealIterator::key (2) meal 2 => tea --> EnglishMealIterator::next (2) --> EnglishMealIterator::valid (3) -----( A2: )----- --> EnglishMealIterator::rewind (0) --> EnglishMealIterator::valid (0) --> EnglishMealIterator::current (0) --> EnglishMealIterator::key (0) meal 0 => breakfast --> EnglishMealIterator::next (0) --> EnglishMealIterator::valid (1) --> EnglishMealIterator::current (1) --> EnglishMealIterator::key (1) meal 1 => dinner --> EnglishMealIterator::next (1) --> EnglishMealIterator::valid (2) --> EnglishMealIterator::current (2) --> EnglishMealIterator::key (2) meal 2 => tea --> EnglishMealIterator::next (2) --> EnglishMealIterator::valid (3) -----( A3: )----- --> EnglishMealIterator::rewind (0) --> EnglishMealIterator::valid (0) --> EnglishMealIterator::current (0) --> EnglishMealIterator::key (0) meal 0 => breakfast --> EnglishMealIterator::next (0) --> EnglishMealIterator::valid (1) --> EnglishMealIterator::current (1) --> EnglishMealIterator::key (1) meal 1 => dinner --> EnglishMealIterator::next (1) --> EnglishMealIterator::valid (2) --> EnglishMealIterator::current (2) --> EnglishMealIterator::key (2) meal 2 => tea --> EnglishMealIterator::next (2) --> EnglishMealIterator::valid (3) ===DONE===