Именованные аргументы PHP 8: удобство и новый контракт функции

2 мин чтения

Когда именованные аргументы PHP 8 делают вызов понятнее и почему переименование параметра может сломать совместимость.

Имя параметра становится частью вызова
  1. СигнатураФункция объявляет имена параметров
  2. Именованный вызовАргументы связываются по имени
  3. СовместимостьПереименование требует проверки вызывающего кода

У функции несколько необязательных параметров, а поменять нужно только последний. В PHP 8 можно назвать его прямо в вызове и не перечислять промежуточные значения. Читать такой код часто удобнее. Но у удобства есть следствие: имя параметра теперь тоже важно для кода, который вызывает функцию.

Понятный вызов

<?php
function page(string $title, int $limit = 20, bool $compact = false): array {
    return [$title, $limit, $compact];
}
$result = page(title: 'Журнал', compact: true);

Не требуется передавать limit только ради доступа к следующему параметру. Значение по умолчанию остаётся в определении функции. Имена не произвольные подписи: они должны совпадать с параметрами. Опечатка не будет молча проигнорирована.

Переименование требует проверки

Если библиотека меняет compact на condensed, старый позиционный вызов может продолжать работать, а именованный перестанет. При развитии общего API проверяйте не только типы и порядок, но и имена. Для внутренних функций учитывайте документированные ограничения конкретного API.

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

Переход без массовой замены

Начните с функций, где часто пропускают необязательные параметры. Проверьте обработчики, обёртки и вызовы через массивы: в PHP 8 строковые ключи при распаковке и динамических вызовах требуют отдельного внимания. Результат обычного вызова и нового варианта должен совпадать на небольшом наборе характерных входных данных.

Пока проект должен работать на PHP 7, именованные аргументы использовать нельзя. Сначала определите минимальную версию и добавьте её проверку в сборку. Само переписывание вызовов и обновление серверного PHP лучше проверять отдельно — так проще найти причину возможной ошибки.

Источники и дальнейшее чтение