匹配来自PHP中的关联数组和函数调用的函数参数

时间:2013-01-31 16:18:20

标签: php function reflection

我有一个以下列形式的关联数组:

$params = array(
    'paramName_4'=>'param_4', 
    'paramName_2'=>'param_2',
    // ...,
    'paramName_6'=>'param_6',
); 

我还有一个函数myFunction定义为:

public function myFunction($paramName_1, $paramName_2, $paramName_3, ....);

PHP中是否存在“解析”函数,以便我可以通过匹配参数调用函数myFunction(即使它们没有按myFunction的参数序列排序)?换句话说,我可以吗

my_magic(__NAMESPACE__.'\\myFunction', $params);

这种“神奇”功能确实存在吗?如果没有,我该如何实施呢?

3 个答案:

答案 0 :(得分:4)

您可以使用reflection来实现它。方法如下:

// The input is the array of arguments and the function name
$arguments = array(....);
$functionName = __NAMESPACE__.'\\myFunction';

$reflector = new \ReflectionFunction($functioName);
$params = $reflector->getParameters();
$values = array();

foreach ($params as $param) {
    $name = $param->getName();
    $isArgumentGiven = array_key_exists($name, $arguments);
    if (!$isArgumentGiven && !$param->isDefaultValueAvailable() {
        die ("Parameter $name is mandatory but was not provided");
    }

    $values[$param->getPosition()] =
        $isArgumentGiven ? $arguments[$name] : $param->getDefaultValue();
}

// You can now call the function:
call_user_func($functionName, $values);

答案 1 :(得分:1)

是的,您可以按@ Jon的示例使用Reflection,但如果问题只是params的顺序不正确,为什么不使用ksort()uksort()来放置它们按照正确的顺序。

然后您可以使用call_user_func_array()。问题解决了。

$params = array(....);

uksort($params, function($a,$b) {
    //sort the params into the known order....
    $sortOrder = array('param1','param2','param3','param4');
    return (array_search($a, $sortOrder) > array_search($b, $sortOrder)) ? -1 : 1;
});

//now that $params is in the right order we can do this....
$retVal = call_user_func_array($func, $params);

我在这里硬编码了param顺序,因为它是最有效的方式。如果您正在调用一个事先不知道正确的参数顺序的函数,那么是的,您需要使用反射。但我认为这是不太可能的(将未知的参数列表传递给未知函数听起来像是黑客的金矿)

答案 2 :(得分:0)

这是一个库,它为给定的函数/方法解析参数:ArgumentsResolver