123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- --TEST--
- ZE2 iterators and foreach
- --FILE--
- <?php
- class c_iter implements Iterator {
- private $obj;
- private $num = 0;
- function __construct($obj) {
- echo __METHOD__ . "\n";
- $this->num = 0;
- $this->obj = $obj;
- }
- function rewind(): void {
- }
- function valid(): bool {
- $more = $this->num < $this->obj->max;
- echo __METHOD__ . ' = ' .($more ? 'true' : 'false') . "\n";
- return $more;
- }
- function current(): mixed {
- echo __METHOD__ . "\n";
- return $this->num;
- }
- function next(): void {
- echo __METHOD__ . "\n";
- $this->num++;
- }
- function key(): mixed {
- echo __METHOD__ . "\n";
- switch($this->num) {
- case 0: return "1st";
- case 1: return "2nd";
- case 2: return "3rd";
- default: return "???";
- }
- }
- }
- class c implements IteratorAggregate {
- public $max = 3;
- function getIterator(): Traversable {
- echo __METHOD__ . "\n";
- return new c_iter($this);
- }
- }
- echo "===Array===\n";
- $a = array(0,1,2);
- foreach($a as $v) {
- echo "array:$v\n";
- }
- echo "===Manual===\n";
- $t = new c();
- for ($iter = $t->getIterator(); $iter->valid(); $iter->next()) {
- echo $iter->current() . "\n";
- }
- echo "===foreach/std===\n";
- foreach($t as $v) {
- echo "object:$v\n";
- }
- echo "===foreach/rec===\n";
- foreach($t as $v) {
- foreach($t as $w) {
- echo "double:$v:$w\n";
- }
- }
- echo "===foreach/key===\n";
- foreach($t as $i => $v) {
- echo "object:$i=>$v\n";
- }
- print "Done\n";
- exit(0);
- ?>
- --EXPECT--
- ===Array===
- array:0
- array:1
- array:2
- ===Manual===
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- 0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- 1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- 2
- c_iter::next
- c_iter::valid = false
- ===foreach/std===
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- object:0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- object:1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- object:2
- c_iter::next
- c_iter::valid = false
- ===foreach/rec===
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- double:0:0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:0:1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:0:2
- c_iter::next
- c_iter::valid = false
- c_iter::next
- c_iter::valid = true
- c_iter::current
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- double:1:0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:1:1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:1:2
- c_iter::next
- c_iter::valid = false
- c_iter::next
- c_iter::valid = true
- c_iter::current
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- double:2:0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:2:1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- double:2:2
- c_iter::next
- c_iter::valid = false
- c_iter::next
- c_iter::valid = false
- ===foreach/key===
- c::getIterator
- c_iter::__construct
- c_iter::valid = true
- c_iter::current
- c_iter::key
- object:1st=>0
- c_iter::next
- c_iter::valid = true
- c_iter::current
- c_iter::key
- object:2nd=>1
- c_iter::next
- c_iter::valid = true
- c_iter::current
- c_iter::key
- object:3rd=>2
- c_iter::next
- c_iter::valid = false
- Done
|