Ответ
В PHP стрелочные функции (arrow functions), представленные в версии 7.4, имеют несколько ключевых отличий от обычных анонимных функций.
Основные различия:
-
Захват переменных из внешней области видимости Стрелочные функции автоматически захватывают переменные из родительской области, где они определены. Для обычных функций необходимо явно использовать конструкцию
use.$multiplier = 5; // Обычная функция $funcNormal = function($n) use ($multiplier) { return $n * $multiplier; }; // Стрелочная функция $funcArrow = fn($n) => $n * $multiplier; -
Синтаксис и возврат значения Стрелочные функции имеют краткий синтаксис
fn(...) => ...и всегда возвращают результат выражения, написанного после=>. В них нельзя использовать фигурные скобки{}или операторreturn.// Обычная функция $square = function($x) { return $x * $x; }; // Стрелочная функция $square = fn($x) => $x * $x; -
Контекст
$thisСтрелочные функции не имеют собственного$this. Внутри них$thisссылается на контекст, в котором функция была определена (обычно объект класса). В обычных анонимных функциях$thisне определен, если только они не объявлены внутри метода класса. -
Ограничения Стрелочные функции предназначены для простых однострочных операций. Они не могут:
- Содержать несколько операторов.
- Использовать
yield(быть генераторами). - Изменять значения захваченных переменных (они захватываются по значению).
Когда использовать:
- Стрелочные функции: Идеальны для коротких колбэков в функциях вроде
array_map,array_filter, где нужен простой возврат значения. - Обычные функции: Необходимы для многострочной логики, побочных эффектов (например, изменение внешних переменных) или при работе с генераторами.
Ответ 18+ 🔞
А, ну вот, опять эти стрелочные функции в PHP! Слушай, как будто на дворе 2002-й год, только что недавно с анонимными разобрались, а тут уже новые припёрли. Ладно, щас объясню, в чём прикол, чтобы ты не охуел потом, когда код писать будешь.
В общем, с версии 7.4 у нас появилась эта мартышлюшка — стрелочная функция. Выглядит как fn($x) => $x * 2. Красиво, коротко, но, ёпта, не всё так просто.
Основные отличия, на которых можно мозги сломать:
-
Захват переменных снаружи Вот тут главный фокус. Обычная анонимка — хитрая жопа, ей надо явно сказать: «Слушай, возьми-ка вот эту переменную
$multiplierизвне, используй». И пишешьuse ($multiplier). А стрелочная — она умная, сама всё видит и хватает. Как кот, который тащит сосиску со стола, пока не смотришь.$multiplier = 5; // Обычная — надо попросить $funcNormal = function($n) use ($multiplier) { return $n * $multiplier; }; // Стрелочная — сама всё стырила, доверия ебать ноль $funcArrow = fn($n) => $n * $multiplier; -
Синтаксис и возврат Тут вообще писец какой простой. У стрелочной — один короткий ствол. Написал
fn(...) => ...и всё, выражение после стрелки автоматически возвращается. Никакихreturn, никаких{}. Попробуй впихнуть туда несколько операторов — получишь ошибку, и будешь сидеть, как дурак.// Обычная — можно нагородить $square = function($x) { $result = $x * $x; return $result; }; // Стрелочная — раз, и готово $square = fn($x) => $x * $x; -
Волшебный
$thisА вот это, блядь, интересно. В обычной анонимке, если она не в методе класса,$this— это хуй в пальто, undefined. А в стрелочной$thisвсегда указывает туда, где функцию объявили. Если в классе — то на объект этого класса. Удобно, но с непривычки голова пухнет. -
Ограничения, блядь! Не думай, что это серебряная пуля. Стрелочная функция — это как одноразовая зажигалка. Захотел сделать что-то сложнее умножения — забудь. Нельзя:
- Писать несколько строк кода (одно выражение, и всё).
- Делать генераторы (про
yieldзабудь). - Менять захваченные снаружи переменные. Она их взяла по значению и заморозила. Хочешь менять — иди нахуй, используй обычную.
Так когда что брать?
- Стрелочные: Идеальны, когда тебе в
array_mapилиarray_filterнужно впихнуть простейшую логику. Типаfn($item) => $item * 2. Быстро, читаемо, элегантно. Ядрёна вошь, как удобно! - Обычные анонимки: Бери их, когда задача сложнее «проехаться по массиву». Нужно что-то записать в лог, изменить состояние, нагородить кучу условий — тут только обычная функция, ёперный театр. Или если работаешь с генераторами — тут без вариантов.
Короче, инструменты разные. Не пытайся всё делать стрелочными, а то получится пиздопроебина в коде. Знай, где что применять, и будет тебе счастье.