Стрелочные функции PHP как удобный аналог анонимных функций

В этой статье мы разберем анонимные функции, замыкания, а также стрелочные функции PHP. Рассмотрим основные отличия, особенности и приведем примеры использования.

Анонимные функции и замыкания PHP

Анонимные функции играют важную роль в PHP и позволяют создавать функции без имени, которые можно присваивать переменным или передавать в качестве аргументов другим функциям. Такие функции создаются с помощью ключевого слова function без указания имени функции. В скобках после ключевого слова идет список параметров, за которыми в фигурных скобках — тело функции.

Приведем пример простой анонимной функции, которая будет складывать два числа и возвращать результат:

$sum = function(int $num1, int $num2): int {
    return $num1 + $num2;
};

echo $sum(3, 7); // 10

В этом примере мы присваиваем анонимную функцию переменной $sum с двумя параметрами типа int и указанием типа возвращаемого значения (: int). Затем вызываем функцию через эту переменную. В результате получаем результат выражения, прописанного в теле функции — то есть сумму чисел, переданных в качестве параметров.

Анонимные функции создают собственную область видимости для переменной $this.

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

Приведем пример с замыканием:

$count = 0;

$increment = function() use (&$count) {
    return ++$count;
};

echo $increment(); // 1
echo $increment(); // 2
echo $increment(); // 3

Создаем замыкание, которое захватывает переменную $count по ссылке с помощью use (&$count). Это означает, что функция $increment может использовать значение переменной $count даже после того, как код, в котором определена $count, уже будет выполнен. Внутри функции значение переменной $count увеличивается на 1 и возвращается новое значение. Таким образом, при каждом вызове $increment() результат будет увеличен на единицу.

Стрелочные функции PHP

Стрелочные функции являются более компактным читабельным аналогом анонимных функций.

Синтаксис стрелочных функций включает в себя символ fn вместо ключевого слова function для объявления функции, набор входящих параметров в скобках после fn и стрелку => для разделения параметров и идущего за ней тела функции. В тело записывается выражение, которое, в отличие от анонимных функций, всегда должно возвращать результат.

Переделаем пример из предыдущего раздела, используя стрелочную функцию:

$sum = fn(int $num1, int $num2): int => $num1 + $num2;

echo $sum(3, 7); // 10

Здесь мы задаем целочисленные параметры для функции и возвращаем результат выражения после => в виде целого числа.

Стоит отметить некоторые отличительные черты стрелочных функций по сравнению с анонимными в PHP.

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

Анонимные и стрелочные функции и также отличаются в отношении управления контекстом объекта. Стрелочные функции автоматически наследуют контекст объекта ($this), в котором они были определены, в то время как анонимные функции создают собственную область видимости для переменной $this.

В отличие от традиционных анонимных функций, стрелочные функции автоматически захватывают переменные из внешней области видимости по значению. Поэтому нет необходимости явно указывать переменные для захвата с помощью оператора use.

Рассмотрим следующий пример:

$factor = 10;

$multiply = fn($x) => $x * $factor;

echo $multiply(5); // 50

В этом примере переменная $factor, определенная во внешней области видимости, захватывается стрелочной функцией и используется для умножения.

Отобразим основные различия анонимных и стрелочных функций в таблице:

ОсобенностьАнонимные функцииСтрелочные функции
Синтаксисfunction ($arg1, $arg2) { … }fn ($arg1, $arg2) => …
Возвращаемое значениеМогут содержать несколько операторов и returnДолжны содержать одно выражение и возвращают его
Контекст $thisСоздают собственную область видимости для $thisНаследуют контекст объекта, в котором определены
Захват переменныхИспользуют use для захвата переменных из внешней области видимостиНеявно захватывают переменные из внешней области видимости
Количество строкНе обязаны быть однострочнымиДолжны быть однострочными
КраткостьМогут быть довольно объемными и многострочнымиПредназначены для простых выражений и краткости

Примеры использования стрелочных функций

Стрелочные функции особенно полезны в коротких выражениях и функциях обратного вызова. Рассмотрим несколько примеров.

Использование в функциях сортировки:

$numbers = [4, 2, 7, 1, 9];

usort($numbers, fn($a, $b) => $a <=> $b);

print_r($numbers); // Вывод: [1, 2, 4, 7, 9]

Фильтрация массива:

$numbers = [3, 2, 6, 1, 8];
$threshold = 5;

$filtered = array_filter($numbers, fn($number) => $number > $threshold);

print_r($filtered); // [6, 8]

Замыкания в классе:

class DemoMessageFormatter {
    private $prefixCallback;

    public function __construct(callable $prefixCallback) {
        $this->prefixCallback = $prefixCallback;
    }

    public function format($message) {
        $prefix = ($this->prefixCallback)();
        return "[{$prefix}] {$message}";
    }
}

$formatter = new DemoMessageFormatter(function() {
    return 'INFO';
});

echo $formatter->format('Какое-то сообщение.'); // [INFO] Какое-то сообщение.

Заключение

Подводя итог, отметим, что стрелочные функции в PHP представляют собой лаконичный способ определения простых анонимных функций. Они идеально подходят для использования в случаях, когда требуется выполнение однострочных операций, таких как коллбэки в функциях высшего порядка. Благодаря автоматическому наследованию контекста объекта и более компактному синтаксису, стрелочные функции повышают читаемость и удобство написания кода. При этом стоит учитывать ограничения стрелочных функций, такие как однострочность и возврат только одного значения.

Оцените статью
DevReflex
Добавить комментарий