PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


Итерируемые объекты (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);
?>

Результат выполнения кода:

abc