123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- --TEST--
- foreach with nested iteratorAggregates
- --FILE--
- <?php
- class EnglishMealIterator implements Iterator {
- private $pos=0;
- private $myContent=array("breakfast", "dinner", "tea");
- public function valid(): bool {
- global $indent;
- echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
- return $this->pos<3;
- }
- public function next(): void {
- global $indent;
- echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
- $this->myContent[$this->pos++];
- }
- public function rewind(): void {
- global $indent;
- echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
- $this->pos=0;
- }
- public function current(): mixed {
- global $indent;
- echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
- return $this->myContent[$this->pos];
- }
- public function key(): mixed {
- global $indent;
- echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
- return "meal " . $this->pos;
- }
- }
- class A1 implements IteratorAggregate {
- function getIterator(): Traversable {
- return new EnglishMealIterator;
- }
- }
- class A2 implements IteratorAggregate {
- function getIterator(): Traversable {
- return new A1;
- }
- }
- class A3 implements IteratorAggregate {
- function getIterator(): Traversable {
- 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";
- }
- ?>
- --EXPECT--
- -----( 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)
|