Загрузка...

Анонимные, стрелочные функции и замыкания в PHP

Зачем использовать стрелочные функции

В PHP есть возможность сокращать запись функций, что экономит время разработки и упрощает чтение кода.
Стрелочные функции появились в PHP 7.4 и отлично подходят для коротких одноразовых операций.


Пример на WordPress Hooks

Допустим, нам нужно добавить новую секцию в фильтре WooCommerce.

Обычный (и довольно громоздкий) код может выглядеть так:

add_filter('woocommerce_get_sections_iiko', 'add_section', 10, 1);

function add_section($sections) {
    $sections = array_merge($sections, ['bonuses' => __('Bonuses', 'iiko')]);
    return $sections;
}

Этот код просто добавляет в массив $sections новый элемент bonuses и возвращает обновлённый массив.
Для такой простой задачи запись из 5 строк выглядит избыточно.


1. Анонимные функции

Первое упрощение — убрать имя функции. Если функция используется только в одном месте, нет смысла выносить её в отдельное объявление.

add_filter('woocommerce_get_sections_iiko', function ($sections) {
    return array_merge($sections, ['bonuses' => __('Bonuses', 'iiko')]);
});

Мы убрали лишнюю переменную и аргументы по умолчанию — код стал компактнее.


2. Стрелочные функции

Стрелочные функции имеют следующий синтаксис:

fn(список_параметров) => выражение;

Главное отличие — они предназначены для возврата одного выражения без return.

Тот же пример со стрелочной функцией:

add_filter(
    'woocommerce_get_sections_iiko',
    fn($sections) => array_merge($sections, ['bonuses' => __('Bonuses', 'iiko')])
);

Теперь задача решается в одной строке, при этом читаемость кода не страдает.


3. Замыкания и внешние переменные

Иногда нужно использовать переменные, определённые снаружи функции.
В анонимных функциях это делается через конструкцию use.

Пример с обычной анонимной функцией:

$new_section = ['bonuses' => __('Bonuses', 'iiko')];

add_filter('woocommerce_get_sections_iiko', function ($sections) use ($new_section) {
    return array_merge($sections, $new_section);
});

В стрелочных функциях переменные из внешней области видимости подхватываются автоматически (по значению):

$new_section = ['bonuses' => __('Bonuses', 'iiko')];

add_filter(
    'woocommerce_get_sections_iiko',
    fn($sections) => array_merge($sections, $new_section)
);

Важные нюансы

  • Стрелочные функции всегда возвращают результат выражения (аналог return внутри обычной функции).
  • В них нельзя писать многострочный код — только одно выражение.
  • Внешние переменные передаются по значению, то есть изменить их внутри функции нельзя.
  • Если нужна передача по ссылке — используйте обычные анонимные функции с use (&$var).

Итог

  • Было: 5 строк с именованной функцией.
  • Стало: 1 строка со стрелочной функцией.
  • Код стал короче, проще и не потерял читаемости.

Используйте стрелочные функции, когда нужно быстро описать простое преобразование данных, особенно в колбэках (array_map, array_filter, хуки WordPress и т.п.).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *