我有一个以下列形式的关联数组:
$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);
这种“神奇”功能确实存在吗?如果没有,我该如何实施呢?
答案 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。