создание и продвижение сайта (вбиваю в ТОП-10, как гвозди)Настройка и сопровождение платной рекламы яндекс.директ

PHP. Руководство по PHP. 2005

Итераторы объектовПред.Глава 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

Отвечу на любые вопросы. С уважением, Дмитрий Владимирович.

Ваше письмо×
Free Web Hosting