11111

Итераторы объектовПред.Глава 19. Классы и объекты (PHP 5)След.

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

- PHP 5 предоставляет механизм итераторов для получения списка всех свойств какого-либо объекта, например, для использования совместно с оператором Разд. foreach в Гл. 16. По умолчанию, в итерации будут участвовать все свойства, объявленные как public.

Пример 19-20. Итерация простого объекта

<?

class MyClass {

public $var1 = 'value 1';

public $var2 = 'value 2';

public $var3 = 'value 3';

protected $protected = 'protected';

private $private = 'private';

}

$class = new MyClass();

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

print "$key => $value\n";

}

- Результат:

var1 => value 1

var2 => value 2

var3 => value 3

- Как показывает результат, Разд. foreach в Гл. 16 проитерировал все принадлежащие объекту public-свойства. Кроме того, программист может включить (implement) в свой класс 1 из внутренних Разд. Интерфейсы объектов PHP 5, именуемый Iterator. Это позволит программисту самому определить, каким именно образом будет осуществляться итерация объекта.

Пример 19-21. Объект Iteration, включающий интерфейс Iterator

<?

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 "текущий: $var\n";

return $var;

}

public function key() {

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

echo "ключ: $var\n";

return $var;

}

public function next() {

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

echo "следующий: $var\n";

return $var;

}

public function valid() {

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

echo "верный: {$var}\n";

return $var;

}}

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

$it = new MyIterator($values);

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

print "$a: $b\n";

}

- Результатом выполнения этого кода станет:

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

текущий: 1

верный: 1

текущий: 1

ключ: 0

0: 1

следующий: 2

текущий: 2

верный: 1

текущий: 2

ключ: 1

1: 2

следующий: 3

текущий: 3

верный: 1

текущий: 3

ключ: 2

2: 3

следующий:

текущий:

верный:

- Программист также может объявить класс так, чтобы ему не пришлось описывать все методы, перечисленные в интерфейсе Iterator, включая интерфейс PHP 5 IteratorAggregate.

Пример 19-22. Объект Iteration, включающий интерфейс IteratorAggregate

<?

class MyCollection implements IteratorAggregate {

private $items = array();

private $count = 0;

/*Required definition of interface 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/value: [$key -> $val]\n\n";

}

?>

</pre>

- Результат:

rewinding

current: value 1

valid: 1

current: value 1

key: 0

key/value: [0 -> value 1]

next: value 2

current: value 2

valid: 1

current: value 2

key: 1

key/value: [1 -> value 2]

next: value 3

current: value 3

valid: 1

current: value 3

key: 2

key/value: [2 -> value 3]

next:

current:

valid:

Пред.

Начало

След.

Перегрузка

Уровень выше

Patterns 22222

Free Web Hosting