В чем разница между стрелочными и обычными функциями в PHP?

Ответ

В PHP стрелочные функции (arrow functions), представленные в версии 7.4, имеют несколько ключевых отличий от обычных анонимных функций.

Основные различия:

  1. Захват переменных из внешней области видимости Стрелочные функции автоматически захватывают переменные из родительской области, где они определены. Для обычных функций необходимо явно использовать конструкцию use.

    $multiplier = 5;
    // Обычная функция
    $funcNormal = function($n) use ($multiplier) {
        return $n * $multiplier;
    };
    // Стрелочная функция
    $funcArrow = fn($n) => $n * $multiplier;
  2. Синтаксис и возврат значения Стрелочные функции имеют краткий синтаксис fn(...) => ... и всегда возвращают результат выражения, написанного после =>. В них нельзя использовать фигурные скобки {} или оператор return.

    // Обычная функция
    $square = function($x) { return $x * $x; };
    // Стрелочная функция
    $square = fn($x) => $x * $x;
  3. Контекст $this Стрелочные функции не имеют собственного $this. Внутри них $this ссылается на контекст, в котором функция была определена (обычно объект класса). В обычных анонимных функциях $this не определен, если только они не объявлены внутри метода класса.

  4. Ограничения Стрелочные функции предназначены для простых однострочных операций. Они не могут:

    • Содержать несколько операторов.
    • Использовать yield (быть генераторами).
    • Изменять значения захваченных переменных (они захватываются по значению).

Когда использовать:

  • Стрелочные функции: Идеальны для коротких колбэков в функциях вроде array_map, array_filter, где нужен простой возврат значения.
  • Обычные функции: Необходимы для многострочной логики, побочных эффектов (например, изменение внешних переменных) или при работе с генераторами.

Ответ 18+ 🔞

А, ну вот, опять эти стрелочные функции в PHP! Слушай, как будто на дворе 2002-й год, только что недавно с анонимными разобрались, а тут уже новые припёрли. Ладно, щас объясню, в чём прикол, чтобы ты не охуел потом, когда код писать будешь.

В общем, с версии 7.4 у нас появилась эта мартышлюшка — стрелочная функция. Выглядит как fn($x) => $x * 2. Красиво, коротко, но, ёпта, не всё так просто.

Основные отличия, на которых можно мозги сломать:

  1. Захват переменных снаружи Вот тут главный фокус. Обычная анонимка — хитрая жопа, ей надо явно сказать: «Слушай, возьми-ка вот эту переменную $multiplier извне, используй». И пишешь use ($multiplier). А стрелочная — она умная, сама всё видит и хватает. Как кот, который тащит сосиску со стола, пока не смотришь.

    $multiplier = 5;
    // Обычная — надо попросить
    $funcNormal = function($n) use ($multiplier) {
        return $n * $multiplier;
    };
    // Стрелочная — сама всё стырила, доверия ебать ноль
    $funcArrow = fn($n) => $n * $multiplier;
  2. Синтаксис и возврат Тут вообще писец какой простой. У стрелочной — один короткий ствол. Написал fn(...) => ... и всё, выражение после стрелки автоматически возвращается. Никаких return, никаких {}. Попробуй впихнуть туда несколько операторов — получишь ошибку, и будешь сидеть, как дурак.

    // Обычная — можно нагородить
    $square = function($x) {
        $result = $x * $x;
        return $result;
    };
    // Стрелочная — раз, и готово
    $square = fn($x) => $x * $x;
  3. Волшебный $this А вот это, блядь, интересно. В обычной анонимке, если она не в методе класса, $this — это хуй в пальто, undefined. А в стрелочной $this всегда указывает туда, где функцию объявили. Если в классе — то на объект этого класса. Удобно, но с непривычки голова пухнет.

  4. Ограничения, блядь! Не думай, что это серебряная пуля. Стрелочная функция — это как одноразовая зажигалка. Захотел сделать что-то сложнее умножения — забудь. Нельзя:

    • Писать несколько строк кода (одно выражение, и всё).
    • Делать генераторы (про yield забудь).
    • Менять захваченные снаружи переменные. Она их взяла по значению и заморозила. Хочешь менять — иди нахуй, используй обычную.

Так когда что брать?

  • Стрелочные: Идеальны, когда тебе в array_map или array_filter нужно впихнуть простейшую логику. Типа fn($item) => $item * 2. Быстро, читаемо, элегантно. Ядрёна вошь, как удобно!
  • Обычные анонимки: Бери их, когда задача сложнее «проехаться по массиву». Нужно что-то записать в лог, изменить состояние, нагородить кучу условий — тут только обычная функция, ёперный театр. Или если работаешь с генераторами — тут без вариантов.

Короче, инструменты разные. Не пытайся всё делать стрелочными, а то получится пиздопроебина в коде. Знай, где что применять, и будет тебе счастье.