Я считаю, что основной причиной является универсальность. Они не делают вещи более читабельными, и вы можете выполнить большую часть того, что spl итераторы делают с помощью простого foreach
.
Но итераторы могут служить своего рода сжатым циклом или источником цикла, который вы можете передавать. Вы можете иметь более разнообразные источники данных, чем просто список / массив. И реальным преимуществом является то, что вы можете обернуть или сложить их для агрегирования.
Имена имен неочевидны, но я думаю, вы могли бы использовать AppendIterator
, например, чтобы объединить статический список имен файлов и результат DirectoryIterator
. Или иначе оберните это в LimitIterator
вместо того, чтобы зашить это в for
условие. Все это довольно простые функции и могут быть сделаны вручную в foreach. Но по крайней мере RegexIterator
и FilterIterator
кажутся подходящими, чтобы уменьшить некоторую сложность.
Но, в конце концов, это действительно стилистический выбор. Это имеет смысл, если у вас есть пользовательские объекты, которые что-то пересекают (например, объект VFS, который может указывать на реальные файлы или записи в базе данных). Но даже тогда вы можете просто iterator_to_array
преобразовать такой список и использовать обычный foreach
-over-array.
Единственный случай, когда действительно необходимо отдавать предпочтение итераторам, это если источник данных неограниченного размера. Развернутые массивы для использования в foreach
могут занимать больше памяти, чем итератор, который может извлекать элемент за элементом.