Добавить в корзинуПозвонить
Найти в Дзене

Частичное применение функций в PHP 8.6

PHP 8.5 только что увидел свет, а внутренняя команда разработчиков языка уже работает над следующим релизом. Выход PHP 8.6 запланирован на 19 ноября 2026 года, и он принесёт долгожданную ключевую функцию — частичное применение функций. Это расширит возможности, заложенные в функциях первого класса из PHP 8.1. Функции первого класса позволяют создавать ссылки на любую вызываемую сущность с помощью специального синтаксиса .... Например, `$replace = str_replace(...);` создаёт ссылку на функцию `str_replace`, которую можно использовать позже. Это особенно полезно при передаче функций в качестве аргументов, например, в `array_map`: Без этого синтаксиса пришлось бы явно объявлять анонимную функцию `fn (string $input) => trim($input)`. По сути, вызов `trim(...)` под капотом создаёт замыкание, оборачивающее оригинальную функцию. Однако у подхода с функциями первого класса есть серьёзное ограничение: невозможно предварительно задать часть аргументов функции. В случае с `str_replace`, которая пр

PHP 8.5 только что увидел свет, а внутренняя команда разработчиков языка уже работает над следующим релизом. Выход PHP 8.6 запланирован на 19 ноября 2026 года, и он принесёт долгожданную ключевую функцию — частичное применение функций. Это расширит возможности, заложенные в функциях первого класса из PHP 8.1.

Функции первого класса позволяют создавать ссылки на любую вызываемую сущность с помощью специального синтаксиса .... Например, `$replace = str_replace(...);` создаёт ссылку на функцию `str_replace`, которую можно использовать позже. Это особенно полезно при передаче функций в качестве аргументов, например, в `array_map`:

Без этого синтаксиса пришлось бы явно объявлять анонимную функцию `fn (string $input) => trim($input)`. По сути, вызов `trim(...)` под капотом создаёт замыкание, оборачивающее оригинальную функцию.

Однако у подхода с функциями первого класса есть серьёзное ограничение: невозможно предварительно задать часть аргументов функции. В случае с `str_replace`, которая принимает три аргумента, полезно было бы иметь краткую запись для создания специализированной функции замены символов, например, для генерации `slug`. Именно эту проблему решает частичное применение функций.

Новый синтаксис позволяет использовать символ `?` в качестве заполнителя для аргументов. Теперь для создания функции `$slugReplace`, заменяющей пробелы и подчёркивания на дефисы, вместо громоздкого замыкания `fn (string $input) => str_replace([' ', '_'], '-', $input)` достаточно написать:

-2

Заполнитель `?` указывает на аргумент, который будет передан позже, а сама конструкция под капотом создаёт новое замыкание.

Эта возможность станет особенно важна в связке с конвейерным оператором `|>` из PHP 8.5. Этот оператор требует, чтобы справа от него находилась функция ровно с одним параметром, что часто вынуждало оборачивать вызовы в лишние замыкания. С частичным применением код становится намного чище:

-3

Таким образом, частичное применение раскрывает истинный потенциал конвейерного оператора, делая код лаконичным и выразительным.

Подробнее о частичном применении функций

Возможности нового синтаксиса шире, чем может показаться на первый взгляд. Заполнителей `?` в одном вызове может быть несколько, и располагаться они могут в любых позициях, а не только в конце списка аргументов.

-4

Помимо позиционного заполнителя `?`, существует также вариативный заполнитель `...`. Он представляет ноль или более ещё не указанных аргументов. Это мощный инструмент для создания гибких ссылок на функции.

-5

Частичное применение полностью поддерживает именованные аргументы, а вариативный заполнитель корректно работает с «оставшимися» параметрами.

-6

Поскольку вариативный заполнитель `...` может представлять ноль аргументов, его можно использовать для отложенного вызова функции, все аргументы которой уже заданы.

-7

Это полезно для инкапсуляции ресурсоёмких операций, выполнение которых нужно отложить или условно.

Синтаксис также работает с методами объектов и статическими методами классов.

-8

Важно отметить несколько исключений. Частичное применение нельзя использовать с:

  • вызовами конструкторов (`new ClassName(...)`),
  • функциями `compact()` и `extract()`,
  • функциями `func_get_args()` и `get_defined_vars()`.

Во всех остальных случаях, включая магические методы ( `__call, __invoke` ), синтаксис работает корректно. При ошибках использования PFA PHP будет выдавать понятные сообщения, помогающие быстро исправить код.

Частичное применение функций — это значительный шаг в развитии PHP, который повысит выразительность кода, особенно в функциональных сценариях и при работе с конвейерами. Осталось лишь дождаться ноября 2026 года, когда эта возможность станет доступна в PHP 8.6.