Генератори в php

Якщо ви що-небудь чули про Ітератор, тоді ви, швидше за все, знаєте, що ітерація - дуже важлива концепція для світу програмування, але імплементація необхідних інтерфейсів для створення об'єктів-ітераторів може бути вельми клопіткою заняттям через великої кількості шаблонного коду, який необхідно написати для роботи ітератора. Але з релізом PHP 5.5 до нас нарешті прийшли генератори!

У цій статті я розгляну генератори, які дозволяють без великих зусиль імплементувати функціональність простих ітераторів без необхідності тягнути за собою всю складність інтерфейсу Iterator.

Як працюють генератори?

Згідно Вікіпедії генератор "дуже схожий на функцію, яка повертає масив, так як генератор має вхідні параметри, його можна викликати і він генерує послідовність значень". У загальних рисах генератор - це звичайна функція, але замість повернення одного значення вона видає стільки значень, скільки від неї може знадобитися. Генератор виглядає як функція, але поводиться як ітератор.

В генераторах використовується ключове слово yield замість слова return. Він поводиться схожим чином, і повертає значення в точку виклику, з тією відмінністю, що функція не видаляється з стека, а її стан зберігається в пам'яті. Це дозволяє функції продовжити роботу з попереднього стану при наступному її виклику. Насправді, ви не можете використовувати ключове слово return для повернення значення з генератора, а для того, щоб припинити виконання генератора.

Керівництво PHP говорить: "Коли викликається генератор, він повертає об'єкт, який може бути проітерірован". Він є об'єктом внутрішнього класу Generator. який імплементує інтерфейс Iterator. і веде себе, як односпрямований ітератор. Поки ви проводите ітерацію над об'єктом, PHP викликає генератор кожен раз, коли йому потрібно отримати значення. Стан зберігається кожного разу, як генератор видає значення, так що наступного разу, коли PHP зажадає значення, генератор відновить свій попередній стан.

Даний код виведе наступне:

Наш перший генератор

Давайте перепишемо зразок генератора Python на мові PHP. (Зауважте, що обидва шматка коду не піклуються про перевірки помилок).

Функція-генератор відкриває файл і видає кожну лінію файлу, якщо її зажадали. Кожен раз при виклику генератора він продовжує роботу з попереднього стану. Робота функції не починається спочатку, так як його стан був збережено перед виконанням оператора yield. Як тільки всі рядки були перебрані - генератор завершує свою роботу, завершується і цикл.

повернення ключів

Ітератори в PHP складаються з пар "ключ / значення". У нашому прикладі ми повертаємо тільки значення, а ключі в цьому випадку будуть числовими (ключі по-замовчуванню числові). Якщо вам необхідно повернути асоціативні пари - просто змініть формат оператора yield так, щоб він включав і ключ, використовуючи синтаксис масивів.

впровадження значень

Оператор yield не тільки повертає значення - він може також приймати значення ззовні. Це робиться шляхом виклику методу send () у об'єкта генератора з передачею необхідного значення в вигляді параметра. Це значення може бути використано в обчисленнях або інших операціях. Метод передає значення в генератор як результат виконання yield, і відновлює виконання.

Висновок буде наступним:

Заощаджуємо пам'ять за допомогою генераторів

Генератори хороші тоді, коли ви обробляєте великі набори даних, і ви не хочете виділяти пам'ять під всі проміжні результати, або якщо ви не знаєте, знадобляться вам всі ці результати взагалі. Через способу обробки результатів використання пам'яті можна зменшити до необхідного мінімуму для зберігання тільки поточного результату роботи.

Уявіть результат роботи функції file (). яка повертає всі рядки читається файлу в вигляді масиву. Якщо порівняти результати роботи функції file () і нашої функції file_lines () над одним і тим же файлом з 100 випадковими параграфами тексту, то функція file () буде використовувати приблизно в 110 разів більше пам'яті, ніж генератор.

висновок

З введенням генераторів PHP дає потужний інструмент в руки розробникам. Тепер ми можемо швидко писати ітератори, при цьому зберігаючи значні обсяги пам'яті під час роботи програми. Сподіваюся, в цьому керівництві я зміг дати вам достатньо інформації для того, щоб ви могли почати використовувати генератори в ваших проектах.

5 останніх уроків рубрики "PHP"

Коли мова йде про безпеку веб-сайту, то фраза "фільтруйте все, екрануйте все" завжди буде актуальна. Сьогодні поговоримо про фільтрації даних.

  • Expressive 2 підтримує можливість підключення інших ZF компонент за спеціальною схемою. Не всім подобається це рішення. У цій статті ми розповімо як поліпшили процес підключення декількох модулів.

  • Припустимо, що вам необхідно відправити якусь інформацію в Google Analytics з серверного скрипта. Як це зробити. Відповідь в цій замітці.

  • Підбірка з декількох видів PHP пісочниць. На деяких ви в режимі online зможете потестить свій код, але є так само рішення, які можна впровадити на свій сайт.

    помилка в коді повинно бути просто echo "Yielded $ i"; без n

    Генератори в php

    За рахунок отримання інформації відразу по двох каналах (зір і слух) ефективність навчання значно перевершує навчання по книгах. А домашні завдання і онлайн-тести дозволять вам постійно думати на мові, що вивчається і відразу перевіряти свої знання!

    Генератори в php

    Генератори в php

    Якщо ви давно хочете як слід вивчити HTML, то у мене для Вас є чудова новина!

    Генератори в php

    Якщо ви вже вивчили HTML і хочете рухатися далі, то наступним кроком буде вивчення технології CSS.

    Генератори в php

    Якщо ви хочете розібратися з поняттями домену і хостингу, навчитися створювати бази даних, закачувати файли сайту на сервер по FTP, створювати піддомени, налаштовувати поштові скриньки для свого сайту і стежити за його відвідуваністю, то цей курс створений спеціально для вас!

    Схожі статті