Что такое стрелочная функция в PHP?

Ответ

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

Синтаксис и пример:

// Обычная анонимная функция (до PHP 7.4)
$multiplier = 2;
$oldFunc = function($x) use ($multiplier) {
    return $x * $multiplier;
};

// Стрелочная функция (PHP 7.4+)
$multiplier = 2;
$arrowFunc = fn($x) => $x * $multiplier;

echo $arrowFunc(5); // Выведет: 10

Ключевые особенности:

  1. Автоматическое захватывание переменных по значению: Все переменные из родительской области видимости (например, $multiplier) доступны автоматически. Не требуется конструкция use.
  2. Неявный возврат: Выражение, указанное после =>, автоматически возвращается. Ключевое слово return использовать нельзя.
  3. Всегда однострочные: Стрелочные функции предназначены для простых операций. Они не могут содержать блоков кода {} или многострочной логики.

Типичное использование: Идеально подходит для коротких операций в функциях вроде array_map, array_filter или usort, где логика умещается в одно выражение.

$users = [['id' => 1, 'active' => true], ['id' => 2, 'active' => false]];
$activeUserIds = array_map(fn($user) => $user['id'], array_filter($users, fn($user) => $user['active']));
// $activeUserIds = [1]

Ответ 18+ 🔞

А, стрелочные функции в PHP! Ну это, блядь, просто праздник какой-то для ленивых разработчиков, ядрёна вошь. Сидишь ты такой, пишешь очередной array_map, и уже терпения ноль ебать от того, что каждый раз надо этот use прописывать, как будто ты заявление в ЗАГСе заполняешь.

Вот представь, раньше было вот так, ёпта:

$multiplier = 2;
$oldFunc = function($x) use ($multiplier) {
    return $x * $multiplier;
};

Смотри, какая муда! Целая церемония: объявил функцию, потом специально сказал — «слушай, функция, вот эту переменную $multiplier смотри, её юзай». А если переменных пять? Ну пиши тогда use ($a, $b, $c, $d, $e), и волнение ебать, не забыл ли чего.

А теперь, с седьмой четвёрки, можно просто:

$multiplier = 2;
$arrowFunc = fn($x) => $x * $multiplier;

echo $arrowFunc(5); // Будет 10, ебать копать

Красота же! Никаких лишних телодвижений. Переменные извне сами подхватываются, как будто они тут свои, родные. И возврат значения — автоматический, что после стрелочки => написал, то и вернётся. return писать вообще нельзя, тебе сразу ошибку выкинут, типа «не, чувак, тут так не принято».

Но есть, конечно, и подводные камни, хитрая жопа. Функция-то всегда однострочная. Хочешь внутри цикл запихнуть или нагородить кучу условий? Забудь. Не для этого её придумали. Это как одноразовый инструмент — взял, быстренько применил там, где нужна простая логика, и выкинул. Идеально для всяких array_map, array_filter.

Смотри, как элегантно получается:

$users = [['id' => 1, 'active' => true], ['id' => 2, 'active' => false]];
$activeUserIds = array_map(fn($user) => $user['id'], array_filter($users, fn($user) => $user['active']));
// В $activeUserIds будет [1], и ни хуя себе

Раньше бы пришлось две отдельные анонимки объявлять, а тут — раз, и в одну строку. Красота, ебушки-воробушки. Главное — помни, что переменные захватываются только по значению. То есть если внутри стрелочки попробуешь $multiplier поменять, то нихуя не выйдет, она же не по ссылке взята. Для таких фокусов придётся возвращаться к старой доброй анонимной функции, с её церемониальным use.

В общем, штука полезная, когда надо быстро и без геморроя. Но если задача сложная — не выёживайся, пиши нормальную функцию, а то потом сам от себя охуеешь, когда через месяц этот свой «шедевр» в одну строку читать будешь.