0

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

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

这个“神奇”功能真的存在吗?如果没有,我该如何实施?

4

3 回答 3

4

您可以使用反射来实现它。就是这样:

// 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);
于 2013-01-31T16:24:56.353 回答
2

是的,您可以按照@Jon 的示例使用反射,但如果问题只是参数的顺序不正确,为什么不直接使用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);

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

于 2013-01-31T16:27:42.473 回答
0

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

于 2014-12-28T00:36:09.513 回答