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