Синтаксис генераторів

Генератор в цілому виглядає як звичайна функція, за винятком того, що замість повернення одного значення, генератор перебиратиме стільки значень, скільки необхідно. Будь-яка функція, що містить 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