Welcome to php club

PHP FAQ from PHPclub.ru: PHP5/Iterator ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Итераторы

Краткое описание

В 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


 
Комментариев нет. [Показать комментарии/форму]