Синтаксис генераторів
Генератор в цілому виглядає як звичайна функція, за винятком того, що замість повернення одного значення, генератор перебиратиме стільки значень, скільки необхідно. Будь-яка функція, що містить yieldє функцією генератора.
Коли генератор викликається, він повертає об'єкт, який можна ітерувати. Коли ви ітеруєте цей об'єкт (наприклад, у циклі foreach), PHP викликає методи ітерації об'єкта щоразу, коли вам потрібне нове значення, після чого зберігає стан генератора і при наступному виклику повертає наступне значення.
Коли всі значення генератора закінчилися, генератор просто завершить роботу, нічого не повернувши. Після цього основний код продовжить роботу, як у масиві закінчилися елементи для перебору.
Зауваження :
Генератори можуть повертати значення, які можна отримати за допомогою Generator::getReturn()
Ключевое словоyield
Вся суть генератора полягає у ключовому слові yield. . У найпростішому варіанті оператор "yield" можна розглядати як оператор "return", за винятком того, що замість припинення роботи функції, "yield" тільки зупиняє її виконання та повертає поточне значення, і при наступному виклику функції вона відновить виконання з місця на якому перервалася.
Приклад #1 Простий приклад видачі значень
Loading...
Результат виконання наведеного прикладу:
1
2
3
Зауваження :
Послідовність цілих чисел буде пов'язана з одержуваними від генератора значеннями, начебто перебирається неасоціативний масив.
Отримання значень із ключами
PHP підтримує асоціативні масиви, і генератори є винятком. Так само, як можна отримувати прості значення, як показано вище, ви можете отримувати значення з ключами.
Синтаксис отримання ключ/значення дуже схожий на синтаксис асоціативних масивів, як показано нижче.
Приклад #2 Отримання пар ключ/значення
Loading...
Результат виконання наведеного прикладу:
1:
PHP
Любит знаки доллара
2:
Python
Любит пробелы
3:
Ruby
Любит блоки
Отримання NULL
Для получения**null
** Треба викликати "Yield" без аргументів. Ключ згенерується автоматично.
Приклад #3 Получениеnull
****
Loading...
Результат виконання наведеного прикладу:
array(3) {
[0]=>
NULL
[1]=>
NULL
[2]=>
NULL
}
Отримання значення за посиланням
Генератори можуть надавати значення за посиланням. Це робиться так само, як повернення посилань із функцій: додаванням амперсанда (&) перед ім'ям функції.
Приклад #4 Отримання значень за посиланням
Loading...
Результат виконання наведеного прикладу:
2... 1... 0...
Делегирование генератора с помощьюyield from
Делегування генератора дозволяє вам отримувати значення з іншого генератора, об'єкта Traversable, або масиву, використовуючи yield from. Зовнішній генератор повертатиме значення з внутрішнього генератора, об'єкта або масиву, до того часу, поки вони їх віддають, після чого продовжиться виконання зовнішнього генератора.
Якщо генератор використовується з yield from, то вираз yield from також повертатиме значення з внутрішнього генератора.
Застереження
Сохранение в массив (наПриклад, с помощьюiterator_to_array()) .
yield from не скидає ключі. Ключі, повернуті з об'єкту Traversable або масиву, збережуться. Таким чином, деякі значення можуть перетинатися по ключах з іншими yield або yield from, Що, при записі в масив, спричинить перезапис колишніх значень.
Загальний випадок, коли це має значення, це коли iterator_to_array() повертає масив із ключами за замовчуванням. В цьому випадку можна отримати несподіваний результат . iterator_to_array() має другий параметр preserve_keys
, який можна встановити в false
, для генерації власних ключів та ігнорування ключів, переданих з об'єкта Generator
Приклад #5yield fromсiterator_to_array()
Loading...
Результат виконання наведеного прикладу:
array(3) {
[0]=>
int(1)
[1]=>
int(4)
[2]=>
int(3)
}
Приклад #6 Основи використання yield from
Loading...
Результат виконання наведеного прикладу:
1 2 3 4 5 6 7 8 9 10
Приклад #7yield from** і значення, що повертаються**
Loading...
Результат виконання наведеного прикладу:
1 2 3 4 5 6 7 8 9 10