如何使用不同的参数顺序调用PHP匿名函数


How to call PHP anonymous function with different order of arguments

我想调用一个匿名函数(lambda或闭包),它有一些参数,我知道参数名称,但我不知道它们的顺序!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);