Именованные аргументы PHP 8: удобство и новый контракт функции
Когда именованные аргументы PHP 8 делают вызов понятнее и почему переименование параметра может сломать совместимость.
- СигнатураФункция объявляет имена параметров
- Именованный вызовАргументы связываются по имени
- СовместимостьПереименование требует проверки вызывающего кода
У функции несколько необязательных параметров, а поменять нужно только последний. В 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 лучше проверять отдельно — так проще найти причину возможной ошибки.
