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

«В чем разница между стрелочными и обычными функциями в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований 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, где нужен простой возврат значения.
  • Обычные функции: Необходимы для многострочной логики, побочных эффектов (например, изменение внешних переменных) или при работе с генераторами.