Сегодня про замыкания на PHP. Сразу оговорюсь, эта статья для тех, кто уже более-менее понимает принципы программирования и умеет писать на PHP. Остальным рекомендую хороший и доступный курс PHP для начинающих от курсов WebShake – здесь вам дадут все необходимые знания для разработки на PHP, которые позже можно будет смело расширять и совершенствовать.

Замыкание или анонимная функция в PHP – это грубо говоря функция без имени, которую можно поместить в переменную или передать в другую функцию в качестве параметра.

Рассмотрим обычную функцию:

function my_function($a, $b){
 return $a*$b;
}

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

Но что, если нам не нужна дополнительная функция, и достаточно создать анонимную функцию без имени, которую мы передадим в другую функцию для обработки её переметра. Если вы знакомы с Python, там это называется ляббда функцией, и там с её помощью мапят массивы. В PHP это называется Closure, и хотя её запустили в версии 5.3, до сих пор нет единого стандарта как и когда её следует использовать.

Посмотрим на пример её использования, для того, чтобы быстро умножить все элементы массива в 10 раз (будем считать, что массив состоит из целочисленных элементов, то есть из int), и нам просто нужно каждый элемент умножить на 10. Можно сделать по-старинке – написать foreach, в котором каждый элемент умножить на 10.

Но можно, ведь, использовать замыкание на PHP, и функцию array_map (это встроенная функция для обхода всех элементов массива). Передадим в функцию array_map нашу анонимную функцию и в ней сразу домножимся. Выглядеть будет гораздо элегантнее.

$my_arr = [5, 1, 10, 41];
$my_arr = array_map( function ($item) {
return $item*10;
}, $my_arr);

В результате, мы увидим массив, в котором каждый элемент домножен на 10. Как видите, я передаю анонимную функцию прямо в другую функцию.

Кстати, внутри замыкания своя область видимости, и внешние переменные, даже если они доступны другим функциям, здесь не будут видны. Для того, чтобы использовать какую-то внешнюю переменную, которая не будет передаваться аргументом функции, есть директива use, в котором и должны быть указаны все переменные, которые нужно использовать помимо аргументов анонимной функции:

$my_array = array_map(function($item) use ($my_another_array, $my_thire_array){ return $item*10; }, $my_array);
Понравилась или помогла статья?
Купите мне кофеКупите мне кофе