Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
PHP 5: Новые возможности.
Итерация объектов
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
07.04.2006
История переиздания
Издание 1.00
[ Дата ]
Первоначальная версия.
Аннотация
Представлены механизмы для итерации объектов (простая итерация, интерфейсы Iterator и IteratorAggregate).
Под итерацией объектов подразумевается последовательный перебор всех переменных объекта.
Простая итерация
Простая итерация осуществляется при помощи цикла foreach. Доступны только видимые из данного контекста переменные.
Пример 1. Простая итерация объекта
<?php
class Foo {
public $public = 'public';
protected $protected = 'protected';
private $private = 'private';
public function iterate()
{
foreach ($this as $var => $value) {
print "$var = $value\n";
}
}
}
print "<pre>\n";
$foo = new Foo;
$foo->iterate();
print "\n";
foreach ($foo as $var => $value) {
print "$var = $value\n";
}
print "</pre>\n";
?>
public = public
protected = protected
private = private
public = public
Интерфейс Iterator
PHP 5 позволяет программисту изменить обычное поведение цикла foreach, возложив тем самым обязанность представления данных на сам класс. Для этого используется встроенный интерфейс Iterator. В классе, к которому применен данный интерфейс должны быть определены следующие пять публичных методов.
Метод rewind. Устанавливает указатель на начало списка. Ничего не возвращает (void).
Метод current. Возвращает значение в текущей позиции (mixed).
Метод key. Возвращает индекс в текущей позиции (mixed).
Метод next. Перемещает указательна следующую пару индекс-значение. Ничего не возвращает (void).
Метод valid. Используется перед current или key. Проверяет, имеется ли в текущей позиции пара индекс-значение. Возвращает логическую величину (bool).
Замечание
Ни один из перечисленных методов не следует вызывать напрямую. Все они используются "за сценой" циклом foreach.
Пример 2. Итерация при помощи интерфейса Iterator
<?php
class Foo implements Iterator {
private $array = array();
function __construct($array)
{
$this->array = $array;
}
public function rewind()
{
reset($this->array);
}
public function current()
{
return pow(current($this->array), 2);
}
public function key()
{
return current($this->array);
}
public function next()
{
next($this->array);
}
public function valid()
{
return $this->current();
}
}
$foo = new Foo(array(1, 2, 3, 4, 5));
print "<pre>\n";
foreach ($foo as $key => $value) {
print "$key^2 = $value\n";
}
print "</pre>\n";
?>
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25
Интерфейс IteratorAggregate
Механизм итерации может быть также вынесен в отдельный класс. В этом случае к классу, объекты которого подлежат итерации, должен быть применен другой интерфейс - IteratorAggregate. Этот интерфейс требует определения единственного метода - getIterator, который возвращает объект класса, осуществляющего итерацию (тип возвращаемой величины - Iterator).
Пример 3. Итерация при помощи интерфейса IteratorAggregate
<?php
class FooIterator implements Iterator {
private $obj;
function __construct($obj)
{
$this->obj = $obj;
}
public function rewind()
{
reset($this->obj);
}
public function current()
{
return pow(current($this->obj), 2);
}
public function key()
{
return current($this->obj);
}
public function next()
{
next($this->obj);
}
public function valid()
{
return $this->current();
}
}
class Foo implements IteratorAggregate {
private $array = array();
function __construct($array)
{
$this->array = $array;
}
public function getIterator()
{
return new FooIterator($this->array);
}
}
$foo = new Foo(array(1, 2, 3, 4, 5));
print "<pre>\n";
foreach ($foo as $key => $value) {
print "$key^2 = $value\n";
}
print "</pre>\n";
?>