JackShcherbakov
@JackShcherbakov

Где могут пригодиться итераторы PHP?

Здравствуйте!

Уже несколько часов не могу понять в чем преимущество классов. Внятного ответа не нашел. Во всех примерах, что я видел, был создан класс, который реализовывает Iterator и в нем было свойство-массив, по которому совершается проход. Зачем весь этот танец с бубном, когда есть простой foreach? Можете, пожалуйста, приветси нормальный пример, который покажет преимущество и незаменимое использование этих итераторов.

Заранее спасибо!
  • Вопрос задан
  • 135 просмотров
Решения вопроса 2
SerafimArts
@SerafimArts
Кратко о себе
Ну раз нужны примеры, то что-нибудь придумаю...

Задача следующая. Надо делать запросы к АПИ по всем доступным страницам, ну я не знаю, например полчаем статьи с хабра. Алгоритм следующий:
- Работаем до тех пор, пока страница не является последней
- Получаем список статей и начинаем их возвращать.
- Как только они кончатся, проверяем, является ли текущая страница последней.
- И так до тех пор, пока страница не кончится.

class HabraArticles implements \IteratorAggregate 
{
    // ...
    // Какие-то методы настроек апишки
    // ...

    public function getIterator(): iterable
    {
        $page = 0;

        do {
            $response = // запрос_к_апи?page=$page++
            yield from $response['articles'];
        } while ($response['last_page'] !== $page);
    }
}


И использование. Мы создаём новый объект нашего апи и настраиваем его. Как только начинаем по нему пробегаться через foreach - автоматом вызывается нужный метод интерфейса (в нашем случае getIterator, т.к. заюзали интерфейс IteratorAggregate).
$articles = (new HabraArticles)
    ->какой_то_метод_настроек(23)
    ->ещё_какой_то_метод_настроек(42);

foreach($articles as $article) {
    \var_dump($article); // Пробегаемся по всем существующим статьям и не думаем о том, как оно работает.
}


Схожим образом реализован, например, симфонёвый файндер: symfony.com/doc/current/components/finder.html
Ответ написан
gromdron
@gromdron
Bitrix developer
На эту тему есть замечательная статья: ashep.org/2013/using-spl-iterators-1

Коротко пару выжимок:
Цикл foreach создаёт копию полученного массива. Если вы имеете дело с большими объёмами данных, такой подход не годится по очевидной причине: снижение производительности. Итератор SPL работает по другому: он обрабатывает один элемент итерируемого списка за раз, делая это куда более эффективно, нежели foreach.


При создании поставщиков данных (data providers) итераторы помогают сделать их более эффективными, предлагаю возможности ленивой загрузки (lazy loading). «Ленивая загрузка» означает то, что фактическое получение данных из источника выполняет только тогда, когда эти данные нужны. Помимо прочего, вы получаете возможность трансформации данных перед тем, как отдавать их клиенту объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
от 2 000 до 4 000 usd.
Teamlead Краснодар
До 100 000 руб.
Duotek Москва
До 120 000 руб.
19 авг. 2018, в 17:22
1000 руб./в час
19 авг. 2018, в 17:11
200000 руб./за проект
19 авг. 2018, в 12:12
40000 руб./в месяц