Annotation of embedaddon/php/tests/lang/foreachLoopIteratorAggregate.001.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: foreach with iteratorAggregate
        !             3: --FILE--
        !             4: <?php
        !             5: class EnglishMealIterator implements Iterator {
        !             6:        private $pos=0;
        !             7:        private $myContent=array("breakfast", "dinner", "tea");
        !             8:        
        !             9:        public function valid() {
        !            10:                global $indent;
        !            11:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            12:                return $this->pos < count($this->myContent);
        !            13:        }
        !            14:        
        !            15:        public function next() {
        !            16:                global $indent;
        !            17:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            18:                $this->pos++;
        !            19:        }
        !            20:        
        !            21:        public function rewind() {
        !            22:                global $indent;
        !            23:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            24:                $this->pos=0;
        !            25:        }
        !            26: 
        !            27:        public function current() {
        !            28:                global $indent;
        !            29:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            30:                return $this->myContent[$this->pos];
        !            31:        }
        !            32:        
        !            33:        public function key() {
        !            34:                global $indent;
        !            35:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            36:                return "meal " . $this->pos;
        !            37:        }
        !            38:        
        !            39: }
        !            40: 
        !            41: class FrenchMealIterator implements Iterator {
        !            42:        private $pos=0;
        !            43:        private $myContent=array("petit dejeuner", "dejeuner", "gouter", "dinner");
        !            44:        
        !            45:        public function valid() {
        !            46:                global $indent;
        !            47:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            48:                return $this->pos < count($this->myContent);
        !            49:        }
        !            50:        
        !            51:        public function next() {
        !            52:                global $indent;
        !            53:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            54:                $this->pos++;
        !            55:        }
        !            56:        
        !            57:        public function rewind() {
        !            58:                global $indent;
        !            59:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            60:                $this->pos=0;
        !            61:        }
        !            62: 
        !            63:        public function current() {
        !            64:                global $indent;
        !            65:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            66:                return $this->myContent[$this->pos];
        !            67:        }
        !            68:        
        !            69:        public function key() {
        !            70:                global $indent;
        !            71:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
        !            72:                return "meal " . $this->pos;
        !            73:        }
        !            74:        
        !            75: }
        !            76: 
        !            77: 
        !            78: Class EuropeanMeals implements IteratorAggregate {
        !            79:        
        !            80:        private $storedEnglishMealIterator;
        !            81:        private $storedFrenchMealIterator;
        !            82:        
        !            83:        public function __construct() {
        !            84:                $this->storedEnglishMealIterator = new EnglishMealIterator;
        !            85:                $this->storedFrenchMealIterator = new FrenchMealIterator;
        !            86:        }
        !            87:        
        !            88:        public function getIterator() {
        !            89:                global $indent;
        !            90:                echo "$indent--> " . __METHOD__  . "\n";
        !            91:                
        !            92:                //Alternate between English and French meals
        !            93:                static $i = 0;
        !            94:                if ($i++%2 == 0) {
        !            95:                        return $this->storedEnglishMealIterator;
        !            96:                } else {
        !            97:                        return $this->storedFrenchMealIterator;
        !            98:                }
        !            99:        }
        !           100:        
        !           101: }
        !           102: 
        !           103: $f = new EuropeanMeals;
        !           104: var_dump($f);
        !           105: 
        !           106: echo "-----( Simple iteration 1: )-----\n";
        !           107: foreach ($f as $k=>$v) {
        !           108:        echo "$k => $v\n";      
        !           109: }
        !           110: echo "-----( Simple iteration 2: )-----\n";
        !           111: foreach ($f as $k=>$v) {
        !           112:        echo "$k => $v\n";      
        !           113: }
        !           114: 
        !           115: 
        !           116: $indent = " ";
        !           117: echo "\n\n\n-----( Nested iteration: )-----\n";
        !           118: $count=1;
        !           119: foreach ($f as $k=>$v) {
        !           120:        echo "\nTop level "  .  $count++ . ": \n"; 
        !           121:        echo "$k => $v\n";
        !           122:        $indent = "     ";
        !           123:        foreach ($f as $k=>$v) {
        !           124:                echo "     $k => $v\n"; 
        !           125:        }
        !           126:        $indent = " ";
        !           127: }
        !           128: 
        !           129: 
        !           130: ?>
        !           131: ===DONE===
        !           132: --EXPECTF--
        !           133: object(EuropeanMeals)#%d (2) {
        !           134:   ["storedEnglishMealIterator":"EuropeanMeals":private]=>
        !           135:   object(EnglishMealIterator)#%d (2) {
        !           136:     ["pos":"EnglishMealIterator":private]=>
        !           137:     int(0)
        !           138:     ["myContent":"EnglishMealIterator":private]=>
        !           139:     array(3) {
        !           140:       [0]=>
        !           141:       string(9) "breakfast"
        !           142:       [1]=>
        !           143:       string(6) "dinner"
        !           144:       [2]=>
        !           145:       string(3) "tea"
        !           146:     }
        !           147:   }
        !           148:   ["storedFrenchMealIterator":"EuropeanMeals":private]=>
        !           149:   object(FrenchMealIterator)#%d (2) {
        !           150:     ["pos":"FrenchMealIterator":private]=>
        !           151:     int(0)
        !           152:     ["myContent":"FrenchMealIterator":private]=>
        !           153:     array(4) {
        !           154:       [0]=>
        !           155:       string(14) "petit dejeuner"
        !           156:       [1]=>
        !           157:       string(8) "dejeuner"
        !           158:       [2]=>
        !           159:       string(6) "gouter"
        !           160:       [3]=>
        !           161:       string(6) "dinner"
        !           162:     }
        !           163:   }
        !           164: }
        !           165: -----( Simple iteration 1: )-----
        !           166: --> EuropeanMeals::getIterator
        !           167: --> EnglishMealIterator::rewind (0)
        !           168: --> EnglishMealIterator::valid (0)
        !           169: --> EnglishMealIterator::current (0)
        !           170: --> EnglishMealIterator::key (0)
        !           171: meal 0 => breakfast
        !           172: --> EnglishMealIterator::next (0)
        !           173: --> EnglishMealIterator::valid (1)
        !           174: --> EnglishMealIterator::current (1)
        !           175: --> EnglishMealIterator::key (1)
        !           176: meal 1 => dinner
        !           177: --> EnglishMealIterator::next (1)
        !           178: --> EnglishMealIterator::valid (2)
        !           179: --> EnglishMealIterator::current (2)
        !           180: --> EnglishMealIterator::key (2)
        !           181: meal 2 => tea
        !           182: --> EnglishMealIterator::next (2)
        !           183: --> EnglishMealIterator::valid (3)
        !           184: -----( Simple iteration 2: )-----
        !           185: --> EuropeanMeals::getIterator
        !           186: --> FrenchMealIterator::rewind (0)
        !           187: --> FrenchMealIterator::valid (0)
        !           188: --> FrenchMealIterator::current (0)
        !           189: --> FrenchMealIterator::key (0)
        !           190: meal 0 => petit dejeuner
        !           191: --> FrenchMealIterator::next (0)
        !           192: --> FrenchMealIterator::valid (1)
        !           193: --> FrenchMealIterator::current (1)
        !           194: --> FrenchMealIterator::key (1)
        !           195: meal 1 => dejeuner
        !           196: --> FrenchMealIterator::next (1)
        !           197: --> FrenchMealIterator::valid (2)
        !           198: --> FrenchMealIterator::current (2)
        !           199: --> FrenchMealIterator::key (2)
        !           200: meal 2 => gouter
        !           201: --> FrenchMealIterator::next (2)
        !           202: --> FrenchMealIterator::valid (3)
        !           203: --> FrenchMealIterator::current (3)
        !           204: --> FrenchMealIterator::key (3)
        !           205: meal 3 => dinner
        !           206: --> FrenchMealIterator::next (3)
        !           207: --> FrenchMealIterator::valid (4)
        !           208: 
        !           209: 
        !           210: 
        !           211: -----( Nested iteration: )-----
        !           212:  --> EuropeanMeals::getIterator
        !           213:  --> EnglishMealIterator::rewind (3)
        !           214:  --> EnglishMealIterator::valid (0)
        !           215:  --> EnglishMealIterator::current (0)
        !           216:  --> EnglishMealIterator::key (0)
        !           217: 
        !           218: Top level 1: 
        !           219: meal 0 => breakfast
        !           220:      --> EuropeanMeals::getIterator
        !           221:      --> FrenchMealIterator::rewind (4)
        !           222:      --> FrenchMealIterator::valid (0)
        !           223:      --> FrenchMealIterator::current (0)
        !           224:      --> FrenchMealIterator::key (0)
        !           225:      meal 0 => petit dejeuner
        !           226:      --> FrenchMealIterator::next (0)
        !           227:      --> FrenchMealIterator::valid (1)
        !           228:      --> FrenchMealIterator::current (1)
        !           229:      --> FrenchMealIterator::key (1)
        !           230:      meal 1 => dejeuner
        !           231:      --> FrenchMealIterator::next (1)
        !           232:      --> FrenchMealIterator::valid (2)
        !           233:      --> FrenchMealIterator::current (2)
        !           234:      --> FrenchMealIterator::key (2)
        !           235:      meal 2 => gouter
        !           236:      --> FrenchMealIterator::next (2)
        !           237:      --> FrenchMealIterator::valid (3)
        !           238:      --> FrenchMealIterator::current (3)
        !           239:      --> FrenchMealIterator::key (3)
        !           240:      meal 3 => dinner
        !           241:      --> FrenchMealIterator::next (3)
        !           242:      --> FrenchMealIterator::valid (4)
        !           243:  --> EnglishMealIterator::next (0)
        !           244:  --> EnglishMealIterator::valid (1)
        !           245:  --> EnglishMealIterator::current (1)
        !           246:  --> EnglishMealIterator::key (1)
        !           247: 
        !           248: Top level 2: 
        !           249: meal 1 => dinner
        !           250:      --> EuropeanMeals::getIterator
        !           251:      --> EnglishMealIterator::rewind (1)
        !           252:      --> EnglishMealIterator::valid (0)
        !           253:      --> EnglishMealIterator::current (0)
        !           254:      --> EnglishMealIterator::key (0)
        !           255:      meal 0 => breakfast
        !           256:      --> EnglishMealIterator::next (0)
        !           257:      --> EnglishMealIterator::valid (1)
        !           258:      --> EnglishMealIterator::current (1)
        !           259:      --> EnglishMealIterator::key (1)
        !           260:      meal 1 => dinner
        !           261:      --> EnglishMealIterator::next (1)
        !           262:      --> EnglishMealIterator::valid (2)
        !           263:      --> EnglishMealIterator::current (2)
        !           264:      --> EnglishMealIterator::key (2)
        !           265:      meal 2 => tea
        !           266:      --> EnglishMealIterator::next (2)
        !           267:      --> EnglishMealIterator::valid (3)
        !           268:  --> EnglishMealIterator::next (3)
        !           269:  --> EnglishMealIterator::valid (4)
        !           270: ===DONE===

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>