Я хочу вызвать анонимную функцию (лямбда или замыкание), которая имеет несколько аргументов, я знаю имена аргументов, но я не знаю их порядок! Функция call_user_func_array () может вызывать функцию с массивом аргументов, но массив не может быть ассоциативным массивом для установки каждого значения для желаемого аргумента, следующие коды — мои попытки решить мою проблему, но они просто не работают!
Функция:
$function = function ($b, $c, $a) {
echo "a=" . $a . " & b=" . $b . " & c=" . $c;
};
Мой желаемый результат:
a=1 & b=2 & c=3
Мои попытки:
// Attempt 1
call_user_func_array($function, array("a" => 1, "b" => 2, "c" => 3));
// Attempt 2
$ref = new ReflectionFunction($function);
$ref->invokeArgs(array("a" => 1, "b" => 2, "c" => 3));
Выход продукции:
a=3 & b=1 & c=2
Вы должны передавать параметры позиционно, имена вообще не учитываются. Вы можете сопоставить параметры по имени с их положением, используя отражение:
$params = array("a" => 1, "b" => 2, "c" => 3);
$ref = new ReflectionFunction($function);
$arguments = array_map(
function (ReflectionParameter $param) use ($params) {
if (isset($params[$param->getName()])) {
return $params[$param->getName()];
}
if ($param->isOptional()) {
return $param->getDefaultValue();
}
throw new InvalidArgumentException('Missing parameter ' . $param->getName());
},
$ref->getParameters()
);
$ref->invokeArgs($arguments);
Других решений пока нет …