Ответ
Стрелочная функция — это краткий синтаксис для написания анонимных функций, представленный в 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
Ключевые особенности:
- Автоматическое захватывание переменных по значению: Все переменные из родительской области видимости (например,
$multiplier) доступны автоматически. Не требуется конструкцияuse. - Неявный возврат: Выражение, указанное после
=>, автоматически возвращается. Ключевое словоreturnиспользовать нельзя. - Всегда однострочные: Стрелочные функции предназначены для простых операций. Они не могут содержать блоков кода
{}или многострочной логики.
Типичное использование: Идеально подходит для коротких операций в функциях вроде 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.
В общем, штука полезная, когда надо быстро и без геморроя. Но если задача сложная — не выёживайся, пиши нормальную функцию, а то потом сам от себя охуеешь, когда через месяц этот свой «шедевр» в одну строку читать будешь.