TGViewer
msavin | Backend & PHP msavin | Backend & PHP @msavin_php · 794 subscribers
Post #60 1.6K
Неочевидное поведение variadic + named arguments

Вот люблю пхп и ненавижу одновременно - постоянно стреляет мне в колено

Следите за руками

С 8х версий появились именованные аргументы, и с тех пор я считал, что для variadic аргументов их нельзя применять. Логично же, что имя одно, а аргументов много, не должно работать

Но на собесе недавно мне сказали, что я не прав

Я проверил, и правда, такой код будет работать:


function foo(string ...$values): void
{
var_dump($values);
}

foo(value1: 'foo', value2: 'bar', abcdf: 'baz');


На экран выведется


[
'value1' => 'foo',
'value2' => 'bar',
'abcdf' => 'baz',
]


То есть применять связку variadic + named arguments можно, но при это само имя для такого параметра может быть абсолютно рандомным (главное чтоб валидным) и оно становится ключом ассоциативного массива внутри.

Как по мне нелогично, но ладно. Я добавил поддержку и настройку такого поведения в своем правиле под rector для автоматического добавления именованных аргументов

Но! На следующий день наполучал ишуей на тему, что именованные аргументы не работают для variadic.

Думал у меня шизофрения, но оказалось, что не работает именно для встроенных функций (не uiserland):


sprintf(format: $message, values1: $property);


Такой вызов приведет к ошибке:


Fatal error: Uncaught Error: Unknown named parameter $values1


При этом phpstan это не подсвечивает:
https://phpstan.org/r/0e634ee6-0d95-4864-a6f6-badd72141320

Я завел в phpstan ишую на эту тему, и в своем правиле разграничил userland от native функций

Но мейнтейнер пхпстана отметил, что некоторые нативные функции все таки принимают именованные аргументы для variadic

Интересно, как глубока кроличья нора?
GitHub Add configurable naming for variadic arguments (opt-out) and related tests/docs by savinmikhail · Pull Request #16 · savinmikh… Motivation Allow the rector to convert positional arguments that map to a variadic parameter into deterministic named arguments like name1, name2 while keeping the feature configurable. Preserve e...
  • 🔥 23
  • 👍 6
  • 🤯 2
  • 👎 1
More from @msavin_php
  1. Jul 3, 2026Я писал кучу всяких библиотек и утилит, но только одна "стрельнула" и на днях пробила 100к…
  2. Jun 8, 2026Выложил видос, где разбираю чужой тех на предмет ошибок, а не прохожу собес самолично. Как…
  3. Apr 7, 2026Новое видео про распределенные транзакции, saga pattern, tcc, 2pc, eventual & strong consi…
  4. Mar 27, 2026Зарелизил наконец-то ролик про кэш в сисдизе Если упустил что-то важное, дайте знать 🙂
  5. Feb 13, 2026Есть относительно популярный вопрос на собесах - про множественное наследование в пхп Тут…
  6. Feb 13, 2026Выложил второй (из планируемых 4х) видос по сисдизу Заодно сделал репозиторий, демонстриру…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →