Итераторы
Краткое описание
В PHP5 объект может быть итерирован в перегруженном виде при использовании foreach. По умолчанию, по соображениям обратной совместимости, итерация происходит по всем свойствам объекта.
*Пример:
<?php
class Foo {
public $x = 1;
public $y = 2;
}
$obj = new Foo();
foreach ($obj as $prop_name => $prop_value) {
echo "$prop_name = $prop_value\n";
}
?>
Результат:
Интерфейсы
IteratorAggregate и
Iterator позволяют указать, каким именно способом, объекты итерируются в PHP-коде. Первый из них имеет метод
getIterator(), который должен вернуть массив или объект, реализующий интерфейс
Iterator.
Пример:
<?php
class ObjectIterator implements Iterator {
private $obj;
private $num;
function __construct($obj) {
$this->obj = $obj;
}
function rewind() {
$this->num = 0;
}
function valid() {
return $this->num < $this->obj->max;
}
function key() {
return $this->num;
}
function current() {
return $this->num . '-й';
}
function next() {
$this->num++;
}
}
class Object implements IteratorAggregate {
public $max = 3;
function getIterator() {
return new ObjectIterator($this);
}
}
$obj = new Object();
// этот foreach-блок ...
foreach ($obj as $key => $val) {
echo "$key = $val\n";
}
// ... эквивалентен следующим 7 строкам for-блока
$it = $obj->getIterator();
for ($it->rewind(); $it->valid(); $it->next()) {
$val = $it->current();
$key = $it->key();
echo "$key = $val\n";
}
unset($it);
?>
Результат:
Эквивалентные блоки очень интересны, т.к. позволяют увидеть использование всех абстрактных методов объявленных в интерфейсах
Iterator и
IteratorAggregate.
Проблемы с обратной совместимостью
Проблем с обратной совместимостью данное нововведение не имеет.
Дополнительные сведения
Описание в оригинальной документации:
http://www.php.net/oop5.iterations