====== Interator ======

Пример реализации интератора range

<code php>
<?php

class RangeIterator implements Iterator {
    protected $start;
    protected $end;
    protected $step;
    
    protected $key;
    protected $value;
    
    public function __construct($start, $end, $step = 1) {
        $this->start = $start;
        $this->end   = $end;
        $this->step  = $step;
    }
    
    public function rewind() {
        $this->key   = 0;
        $this->value = $this->start;
    }
    
    public function valid() {
        return $this->value < $this->end;
    }
    
    public function next() {
        $this->value += $this->step;
        $this->key   += 1;
    }
    
    public function current() {
        return $this->value;
    }
    
    public function key() {
        return $this->key;
    }
}

$interator = new RangeIterator(0, 11);

foreach($interator as $item){
  
	echo (string) $item . "\n";
	
}
</code>

Вывод

  php ./interator.php
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10

Пример интератора (перебор данных файла)
(к сожалению не рабочий и в таком случае нада использовать [[php:5.5:yield|генератор]])

<code php>
class FileIterator implements Iterator {
    protected $f;
    public function __construct($file) {
        $this->f = fopen($file, 'r');
        if (!$this->f) throw new Exception();
    }
    public function current() {
        return fgets($this->f);
    }
    public function key() {
        return ftell($this->f);
    }
    public function next() {
    }
    public function rewind() {
        fseek($this->f, 0);
    }
    public function valid() {
        return !feof($this->f);
    }
}

$file = new FileIterator($path);

foreach($file as $line_nunmber => $line_value){
    // do it
}
</code>