Итераторы объектов в PHP

PHP 5 предоставляет такой способ объявления объектов, который дает возможность пройти по списку элементов данного объекта, например, с помощью оператора foreach. По умолчанию, в этом обходе (итерации) будут участвовать все видимые свойства объекта.

Пример #1 Итерация простого объекта

<?php

class MyClass

{

    public $var1 = 'value 1';

    public $var2 = 'value 2';

    public $var3 = 'value 3';

 

    protected $protected = 'protected var';

    private   $private   = 'private var';

 

    function iterateVisible() {

       echo "MyClass::iterateVisible:n";

       foreach($this as $key => $value) {

           print "$key => $valuen";

       }

    }

}

 

$class = new MyClass();

 

foreach($class as $key => $value) {

    print "$key => $valuen";

}

echo "n";

 

 

$class->iterateVisible();

 

?>

Результат выполнения данного примера:

var1 => value 1

var2 => value 2

var3 => value 3

 

MyClass::iterateVisible:

var1 => value 1

var2 => value 2

var3 => value 3

protected => protected var

private => private var

Как показывает результат, foreach проитерировал все принадлежащие объекту видимые свойства. Кроме того, вы можете развить эту концепцию и реализовать один из встроенных в PHP 5 интерфейсов - Iterator. Это позволит самому объекту решать, что и как должно быть итерировано.

Пример #2 Объект Iteration, реализующий интерфейс Iterator

<?php

class MyIterator implements Iterator

{

    private $var = array();

 

    public function __construct($array)

    {

        if (is_array($array)) {

            $this->var = $array;

        }

    }

 

    public function rewind()

    {

        echo "перемотка в началоn";

        reset($this->var);

    }

  

    public function current()

    {

        $var = current($this->var);

        echo "текущий: $varn";

        return $var;

    }

  

    public function key() 

    {

        $var = key($this->var);

        echo "ключ: $varn";

        return $var;

    }

  

    public function next() 

    {

        $var = next($this->var);

        echo "следующий: $varn";

        return $var;

    }

  

    public function valid()

    {

        $key = key($this->var);

        $var = ($key !== NULL && $key !== FALSE);

        echo "верный: $varn";

        return $var;

    }

 

}

 

$values = array(1,2,3);

$it = new MyIterator($values);

 

foreach ($it as $a => $b) {

    print "$a: $bn";

}

?>

Результат выполнения данного примера:

перемотка в начало

верный: 1

текущий: 1

ключ: 0

0: 1

следующий: 2

верный: 1

текущий: 2

ключ: 1

1: 2

следующий: 3

верный: 1

текущий: 3

ключ: 2

2: 3

следующий:

верный: 

Можно также объявить класс без необходимости описывать все методы, перечисленные в интерфейсе Iterator, для этого нужно просто реализовать PHP 5 интерфейс IteratorAggregate.

Пример #3 Объект Iteration, реализующий интерфейс IteratorAggregate

<?php

class MyCollection implements IteratorAggregate

{

    private $items = array();

    private $count = 0;

 

    // Требование интерфейса IteratorAggregate

    public function getIterator() {

        return new MyIterator($this->items);

    }

 

    public function add($value) {

        $this->items[$this->count++] = $value;

    }

}

 

$coll = new MyCollection();

$coll->add('value 1');

$coll->add('value 2');

$coll->add('value 3');

 

foreach ($coll as $key => $val) {

    echo "ключ/значение: [$key -> $val]nn";

}

?>

Результат выполнения данного примера:

перемотка в начало

текущий: value 1

верный: 1

текущий: value 1

ключ: 0

ключ/значение: [0 -> value 1]

 

следующий: value 2

текущий: value 2

верный: 1

текущий: value 2

ключ: 1

ключ/значение: [1 -> value 2]

 

следующий: value 3

текущий: value 3

верный: 1

текущий: value 3

ключ: 2

ключ/значение: [2 -> value 3]

 

следующий:

текущий:

верный:




Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка