Загрузка...

Анонимные функции и замыкания в PHP

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

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

Приведу пример, на хуках WordPress.

Типичный код какой-нибудь фичи из интернетов выглядит примерно так:

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

Код выполняет простую функцию — добавить в массив sections, новый элемент bonuses и выведет его в месте вызова хука.
Код выглядит достаточно громоздко для такой простой процедуры. Попробуем его сократить.

Первое, что можно сделать, это убрать имя функции, т.к. оно не нужно вообще. Сделать это можно использовав возможность языка — анонимные функции. Заодно уберем лишнюю переменную $sections и аргументы по-умолчанию.

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

Код выглядит уже гораздо лучше. Но можно еще упростить, воспользовавшись стрелочными функциями.
Синтаксис такой:

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

код будет выглядеть так:

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

Таким образом мы сократили 5 строчек кода до одной. И что самое важное, при этом код не стал менее удобным и читаемым!

Внешние аргументы

Дополнительно есть возможность использовать внешние аргументы. В нашем примере c анонимной функцией это будет выглядеть так:

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

Если использовать стрелочную функцию, то так:

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

Важно отметить, что стрелочные функции используют передачу аргумента по значению, т.е. не могут изменить значение внешнего аргумента внутри функции и вернуть его.

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

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