Знайомство з генераторами

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Генератори надають легкий спосіб реалізації простих ітераторів без використання додаткових ресурсів чи складнощів, пов'язаних з реалізацією класу, що реалізує інтерфейс Iterator

Генератор дозволяє вам писати код, який використовує foreach для перебору набору даних без необхідності створення масиву в пам'яті, що може призвести до перевищення ліміту пам'яті, або зажадає багато часу для його створення. Натомість, ви можете написати функцію-генератор, яка, по суті, є звичайною функцією, за винятком того, що замість повернення єдиного значення, генератор може повертати (yield) стільки разів, скільки необхідно для генерації значень, що дозволяють перебрати вихідний набір даних.

Наочним прикладом вищесказаного може послужити використання функції range()как генератора. Стандартная функцияrange() генерує масив, що складається із значень, і повертає його, що може призвести до генерації величезних масивів даних. Наприклад, виклик range(0, 1000000) призведе до використання понад 100 МБ оперативної пам'яті.

Як альтернатива ми можемо створити генератор xrange(), який використовує пам'ять тільки для створення об'єкта Iterator та збереження поточного стану, що вимагатиме не більше 1 кілобайта пам'яті.

Приклад #1 Реализацияrange()как генератора

Loading...

Результат виконання наведеного прикладу:

Нечётные однозначные числа с помощью range():  1 3 5 7 9
Нечётные однозначные числа с помощью xrange(): 1 3 5 7 9

Об'єкт Generator

Коли функція генератор викликається, вона поверне об'єкт вбудованого класу Generator. Цей об'єкт реалізує інтерфейс Iterator, стане односпрямованим об'єктом ітератора та надасть методи, за допомогою яких можна керувати його станом, включаючи передачу до нього та повернення з нього значень.