Приднестровская поддержка XOOPS
Итераторы являются ещё одной формой перегрузки объектов, подобно методу __toString() для строк, о котором мы уже говорили в этой главе. Однако вместо того чтобы перегружать объект, чтобы его можно было обрабатывать как строку, итераторы позволяют работать с объектами как с массивами, прохождение по которым можно осуществлять с помощью конструкции foreach. Реализовать итерации в классах можно многими способами; самый простой из них заключается в том, чтобы обрабатывать экземпляр объекта как массив. Тогда по всем открытым свойствам объекта можно будет проходить как по ассоциативному массиву. Для этого используется оператор foreach (см. листинг 28).
Листинг 28
class IterateExample {
public $var_one = 1;
public $var_two = 2;
private $var_three = 3;
public $var_four = 4;
}
$inst = new IterateExample();
foreach( $inst as $key => $value ) {
echo "$key = $value\n";
}
Чтобы реализовать более сложную форму итераторов в каком-то своем классе (например, для манипуляции какими-нибудь свойствами самого класса — допустим, строками базы данных), необходимо ввести три внутренних интерфейса PHP: Traversable, Iterator и IteratorAggregate. Представление этих интерфейсов в виде PHP-кода можно найти в листинге 29.
Листинг 29
interface Traversable {
/* Пустой интерфейс */
}
interface IteratorAggregate {
public function getIterator();
}
interface Iterator {
public function rewind();
public function hasMore();
public function key();
public function current();
public function next();
}
Первый из этих интерфейсов, интерфейс Traversable, является пустым интерфейсом, и используется только для того, чтобы показать, можно ли проходить по классу с помощью интерфейса Iterator. Таким образом, чтобы создать класс, который бы поддерживал итерацию, потребуется реализовать оба интерфейса, Traversable и Iterator, как показано в листинге 30.
Листинг 30
class IterateExample implements Iterator, Traversable {
private $words = "Быстрая хитрая наглая лиса";
private $cur = 0;
private $max = 0;
function __construct() {
$this->max = count(explode(" ", $this->words));
}
public function rewind() {
$this->cur = 0;
}
public function hasMore() {
if($this->cur < $this->max) {
return true;
}
return false;
}
public function key() {
return $this->cur;
}
public function current() {
$ar = explode(" ", $this->words);
return $ar[$this->cur];
}
public function next() {
$this->cur++;
}
}
$inst = new IterateExample();
foreach($inst as $key => $value) {
echo "$key = $value\n";
}
Результатом выполнения этого кода является объект, проходящий по словам из фразы в свойстве $words объекта:
0 = Быстрая
1 = хитрая
2 = наглая
3 = лиса
Отправитель | Нити |
---|
3 пользователь(ей) активно (1 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 3 далее... |