Лямбда-функції і замикання, близько програмування
- Ми припускаємо, що у вас є базові знання PHP.
Що це за функції такі: лямбда і замикання?
Лямбда-функції і замикання - це програмні об'єкти, що не володіють ім'ям, вони реалізуються там, де потрібна була їхня допомога. Зверніть увагу, лямбда-функції не захоплюють контекст, а замикання призначені для його захоплення. Відразу скажемо, обидві ці функції в PHP за типом відповідають класу Closure. і зазначені вище відмінності не принципові для практичного використання в PHP. У практиці ви помітите тільки те, що від класу Closure ні успадковуватися не можна, ні екземпляри створювати. Його ввели тільки для внутрішнього використання - для типізації.
Лямбда-функції
- Навчиться використовувати лямбда функції в якості параметрів інших функцій
Лямбда-функції. виявляється, дуже корисні для "здоров'я" деяких функцій. особливо тих, які вимагають як параметр функцію.
Давайте розглянемо функцію usort (). сортують будь-які масиви. Для своєї роботи вона вимагає два параметри. Перший - масив, який треба впорядкувати. Другий - функція, з двома аргументами. У цій функції порівнюються два значення, які їй передали. Вона повинна повертати 0 якщо вони рівні, -1 якщо перше менше і 1 якщо друге менше.
Уявіть, що нам все в одному місці програми потрібно впорядкувати масив об'єктів по деякому полю, нам не потрібно оголошувати окрему функцію, ми скористаємося лямбда-функцією. У лістингу №1 показано як використовувати лямбда-функцію для сортування масиву.
Лістинг №1 (рядки лямбда-функції підсвічені):
У цьому прикладі відбувається заповнення масиву $ aNumber об'єктами, які створюються на основі класу naturalNumber. У кожному об'єкті зберігається випадкове число, доступ до якого здійснюється через функції getNumber () і setNumber (). Потім відбувається сортування масиву з використанням лямбда-функції. Для usort () необхідно, щоб другим параметром була вказана функція з двома аргументами, кожен з яких повинен відповідати за типом елементів сортованого масиву. Після заповнення масиву і в кінці програми відбувається висновок масиву.
- Використовувати контекст функції
Лістинг №2 (рядки замикання підсвічені):
У цьому прикладі відбувається створення рядка з багатовимірного масиву, шляхом склеювання всіх його елементів через пробіл. Стандартно для склеювання використовується функція implode (). але тут не той випадок - вона не склеює багатовимірні масиви. Може для когось цей приклад буде до речі.
Існує особливість, яку потрібно враховувати, коли ви використовуєте замикання в методі (метод - функція, член класу). Виявляється воно (замикання) захоплює внутрішню змінну $ this (що відповідає за поточний екземпляр). Для того, щоб її все-таки передати в замикання, потрібно використовувати локальну змінну, наприклад ось так $ self = $ this. а потім вже передавати в замикання use ($ self).
Є питання? Ласкаво просимо в коментарі.