Возникли проблемы с передачей именованных аргументов внутренним функциям с переменными параметрами

#php #array-map #php-8

#php #array-map #php-8

Вопрос:

Я немного поиграл с функцией array_map в php и подумал об использовании ее с именованными аргументами, так как порядок параметров всегда меня раздражает. (Функции не делают ничего полезного. Просто нужно было что-то протестировать.)

Пока все хорошо, работает так, как ожидалось:

 $testArray = [
    'a' => [],
    'b' => [1, 2, 3],
];
$result = array_map(array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr);
 

(Даже если мне потребовалось некоторое время, чтобы выяснить имя параметра массива, поскольку это задокументировано как array1 в немецких документах. Но это то, чем я займусь, как только у меня появится на это время.)

Но затем я попытался вызвать функцию с большим количеством параметров.

Итак, моя первая попытка:

 array_map(array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr, []);
 

Неустранимая ошибка: невозможно использовать позиционный аргумент после именованного аргумента в

Я узнал, что я не должен передавать позиционные аргументы после именованных аргументов.

Затем наоборот:

 array_map([], array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr);
 

Неустранимая ошибка: неперехваченная ошибка: именованный параметр $callback перезаписывает предыдущий аргумент в

Хорошо. Он принимает первый параметр в качестве первого позиционного параметра и сбивается с толку, поскольку я перезаписываю его.

Я начал гуглить. Хорошо, неизвестные именованные аргументы передаются переменным параметрам. Давайте попробуем:

 array_map(array: $testArray, callback: fn (array $arr) => count($arr) === 0 ? null : $arr, additional: []);
 

Неустранимая ошибка: неперехваченный аргумент: array_map() не принимает неизвестные именованные параметры

Итак … есть ли какой-нибудь способ сделать это? Я даже посетил rfc об именованных аргументах, но не нашел ничего похожего на решение. Не могли бы вы, ребята, дать мне подсказку о том, как это сделать?

Комментарии:

1. Это действительно хороший вопрос, и я думаю, что примечание Никиты в этом отчете об ошибке — это почти то же самое. (Сама ошибка напрямую не связана, только примечание.)