В этой статье мы разберем анонимные функции, замыкания, а также стрелочные функции 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 представляют собой лаконичный способ определения простых анонимных функций. Они идеально подходят для использования в случаях, когда требуется выполнение однострочных операций, таких как коллбэки в функциях высшего порядка. Благодаря автоматическому наследованию контекста объекта и более компактному синтаксису, стрелочные функции повышают читаемость и удобство написания кода. При этом стоит учитывать ограничения стрелочных функций, такие как однострочность и возврат только одного значения.