1. Он также сам по себе является итератором. При создании его экземпляра его необходимо передать другому итератору для внутреннего хранения, то есть внутренней итерации InnerIterator.
2. Исходную функцию итератора можно обновить, унаследовав IteratorIterator.
Параметры его конструкции также должны быть итераторами, а сама сигнатура параметра требует объекта, реализующего интерфейс Traversable.
Пример
класс OutIterator расширяет IteratorIterator { публичная функция перемотки() { эхо __METHOD__, PHP_EOL; вернуть родителя::rewind(); } публичная функция действительна() { эхо __METHOD__, PHP_EOL; вернуть родителя::valid(); } публичная функция current() { эхо __METHOD__, PHP_EOL; вернуть родитель::current() '_suffix'; } открытый функциональный ключ() { эхо __METHOD__, PHP_EOL; вернуть родителя::key(); } публичная функция next() { эхо __METHOD__, PHP_EOL; вернуть родителя::next(); } публичная функция getInnerIterator() { эхо __METHOD__, PHP_EOL; вернуть родителя::getInnerIterator(); } } $iterator = новый OutIterator(новый ArrayIterator([1, 2, 3])); foreach ($итератор как $k => $v) { эхо $k, ':', $v, PHP_EOL; } // OutIterator::перемотка назад // OutIterator::действительный // OutIterator::current // OutIterator::key // 0: 1_суффикс // OutIterator::следующий // OutIterator::действительный // OutIterator::current // OutIterator::key // 1:2_суффикс // OutIterator::следующий // OutIterator::действительный // OutIterator::current // OutIterator::key // 2:3_суффикс // OutIterator::следующий // OutIterator::действительный
Вышеизложенное представляет собой понимание итератора упаковки PHP, я надеюсь, что это будет полезно всем. Дополнительное руководство по изучению PHP: сеть исходного кода