【问题标题】:How to call PHP anonymous function with different order of arguments如何使用不同的参数顺序调用 PHP 匿名函数
【发布时间】:2015-08-02 17:05:08
【问题描述】:

我想调用一个带有一些参数的匿名函数(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

【问题讨论】:

    标签: php function lambda closures


    【解决方案1】:

    您必须按位置传递参数,根本不考虑名称。您可以使用反射按名称将参数映射到它们的位置:

    $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);
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 2014-09-11
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多