Итерируемые
Iterable - псевдотип, введенный в PHP 7.1. Он принимает любой массив (array) или объект, реализующий интерфейс Traversable. Оба этих типа итерируются с помощью foreach и могут быть использованы с yield from в генераторах.
Использование Iterable
Тип iterable может использоваться как тип параметра для указания, что функция принимает набор значений, но ей не важна форма этого набора, пока он будет использоваться с foreach. Если значение не является массивом или объектом, реализующим Traversable, будет выброшено исключение TypeError.
Пример #1 Пример использования iterable в качестве параметра
<?php
function foo(iterable $iterable) {
foreach ($iterable as $value) {
// ...
}
}
?>
Параметры, объявленные как iterable, могут использовать null
или массив
в качестве значения по умолчанию.
Пример #2 Пример установки значения по умолчанию для iterable
<?php
function foo(iterable $iterable = []) {
// ...
}
?>
Iterable также может использоваться как возвращаемый тип для указания, что функция вернет итерируемое значение. Если возвращаемое значение не является массивом или объектом, реализующим Traversable, будет выброшено исключение TypeError.
Пример #3 Пример использования iterable в качестве возвращаемого типа
<?php
function bar(): iterable {
return [1, 2, 3];
}
?>
Функции, объявляющие iterable как возвращаемый тип, также могут быть генераторами.
Пример #4 Пример использования iterable в качестве возвращаемого значения генератора
<?php
function gen(): iterable {
yield 1;
yield 2;
yield 3;
}
?>
Приведение типа iterable
Наследующие/реализующие классы могут расширять методы, использующие массив (array) или объекты, реализующие Traversable в качестве типов параметров до iterable или ограничить возвращаемые типы с iterable до массива (array) или Traversable.
Пример #5 Пример приведения типа iterable
<?php
interface Example {
public function method(array $array): iterable;
}
class ExampleImplementation implements Example {
public function method(iterable $iterable): array {
// Тип параметра расширен, а возвращаемое значение ограничено.
}
}
?>