Неочевидное поведение 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
Интересно, как глубока кроличья нора?