Я хочу вызвать анонимную функцию (лямбда или закрытие), которая имеет некоторые аргументы, я знаю имена аргументов, но я не знаю их порядок! Функция 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);