Итерируемые объекты (Iterables) в PHP
Начиная с версии 7.1, PHP предоставляет новый псевдотип, называемый итерабельным. Он принимает любой объект (например, массив), реализующий интерфейс Traversable. Этот тип использует конструкцию foreach или функцию генератора, которая выдает одно значение за раз.
Что такое итерируемый объект?
Итерируемым является любое значение, которое можно перебрать в цикле foreach()
.
Псевдо-тип iterable
был введен в PHP 7.1, и он может быть использован в качестве типа данных для аргументов функции или в качестве возвращаемого типа функции.
Если значение не является массивом или экземпляром Traversable
, будет выдана ошибка TypeError
.
Использование итераций
В качестве типа данных аргумента функции или в качестве возвращаемого типа функции может быть использовано ключевое слово iterable
:
Пример
Попробуй сам »<?php
function printIterable(iterable $myIterable) { //аргумент итерируемой функции
foreach($myIterable as $item) {
echo $item . "<br>";
}
}
$arr = ["Итерируемые", "объекты", "PHP"];
printIterable($arr);
?>
Результат выполнения кода:
объекты
PHP
Iterable также может использоваться в качестве возвращаемого типа, чтобы указать, что функция вернет итеративное значение:
Пример
Попробуй сам »<?php
function getIterable():iterable {
return ["Итерируемые", "объекты", "PHP"];
}
$myIterable = getIterable();
foreach($myIterable as $item) {
echo $item . "<br>";
}
?>
Результат выполнения кода:
объекты
PHP
Создание итераций
Массивы
Все массивы являются итерируемыми, поэтому любой массив можно использовать в качестве аргумента функции, для которой требуется итерация.
Итераторы
Любой объект, реализующий интерфейс Iterator
, может использоваться в качестве аргумента функции, для которой требуется итерация.
Итератор содержит список элементов и предоставляет методы для их просмотра. Он сохраняет указатель на один из элементов списка. У каждого элемента в списке должен быть ключ, который можно использовать для поиска элемента.
Итератор должен иметь следующие методы:
Метод | Описание |
---|---|
current() | Возвращает элемент, на который в данный момент указывает указатель. Это может быть любой тип данных. |
key() | Возвращает ключ, связанный с текущим элементом в списке. Это может быть только целое число, число с плавающей запятой, логическое значение или строка. |
next() | Перемещает указатель на следующий элемент в списке. |
rewind() | Перемещает указатель на первый элемент в списке. |
valid() | Если внутренний указатель не указывает ни на один элемент (например, если next () был вызван в конце списка), он должен вернуть false. В любом другом случае возвращает true. |
Простейший пример реализации интерфейса Iterator
:
<?php
// Создать итератор
class MyIterator implements Iterator {
private $items = [];
private $pointer = 0;
public function __construct($items) {
// array_values() гарантирует, что ключи являются числами
$this->items = array_values($items);
}
public function current() {
return $this->items[$this->pointer];
}
public function key() {
return $this->pointer;
}
public function next() {
$this->pointer++;
}
public function rewind() {
$this->pointer = 0;
}
public function valid() {
// count() указывает, сколько элементов в списке
return $this->pointer < count($this->items);
}
}
// Функция, использующая итерации
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
// Используем $iterator как итерируаемый объект
$iterator = new MyIterator(["a", "b", "c"]);
printIterable($iterator);
?>
Результат выполнения кода: