我刚刚编写了这个函数,它允许您通过关联数组调用函数。虽然我只在标量类型上测试过它,但它应该适用于接受ints
, floats
,strings
和booleans
. 我写得很快,它肯定可以通过多种方式改进:
function call_user_func_assoc($function, $array){
$matches = array();
$result = array();
$length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches);
for($i = 0; $i < $length; $i++){
if(isset($array[$matches[3][$i]]))
$result[$i] = $array[$matches[3][$i]];
else if($matches[2][$i] == 'optional')
$result[$i] = eval('return ' . $matches[4][$i] . ';');
else
throw new ErrorException('Missing required parameter: $' . $matches[3][$i]);
}
call_user_func_array($function, $result);
}
你可以像这样使用它:
function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){
var_dump(func_get_args());
}
call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));
哪个输出:
array(4) {
[0]=>
string(3) "Bob"
[1]=>
string(14) "default string"
[2]=>
int(2)
[3]=>
int(30)
}