我正在用PHP编写一个构造,其中解析器确定动态调用哪个函数,类似这样:
// The definition of what to call
$function_call_spec = array( "prototype" => "myFunction",
"parameters" => array( "first_par" => "Hello",
"second_par" => "World"));
// Dispatch
$funcPrototype = $function_call_spec["prototype"];
$funcPrototype(); // Here we call function 'myFunction'.
这一切都很好,花花公子。但现在是下一步,传递参数,我不知道是否有可能按照我想要的方式进行。它永远不会让我惊讶,但是这些天脚本语言可以做什么,所以这里是:
可以将参数传递给函数,如下所示:
// Here we call function 'myFunction' with the array of parameters.
$funcPrototype( $function_call_spec["parameters"] );
但是,我想用明确的参数等正确地声明'myFunction':
function myFunction( $first_par, $second_par )
{
}
接下来的问题是:有没有办法通过循环参数数组动态地将参数传递给函数?
为了澄清,我不想要这样做:
$funcPrototype( $function_call_spec["parameters"]["first_par"],
$function_call_spec["parameters"]["second_par"] );
因为这需要我的代码静态地知道关于myFunction的详细信息,这违背了整个想法。
相反,我想以某种方式这样做:
// Special magic PHP function which can be used for invoking functions dynamically
InvokeFunction( $funcPrototype, $function_call_spec["parameters"] );
然后调用myFunction,并将数组中的所有参数传递给原型中的每个单独的参数变量。
欢迎任何评论。
问候。
/ R
PS:这篇文章中的所有代码都没有针对拼写错误等进行过测试。
答案 0 :(得分:11)
你应该使用可以调用任何函数或方法的call_user_func_array
并从数组中获取参数。
或者您可以使用ReflectionFunction::invokeArgs
,但除了已经将此类用于其他内容(例如检查您调用的函数是否接受适当数量和类型的参数)之外,没有call_user_func_array
的好处。
答案 1 :(得分:5)
call_user_func_array($funcPrototype, $function_call_spec["parameters"]);
您可能希望创建一个根据您的偏好命名函数的包装器,例如:
function InvokeFunction($function, $args = array()) {
return call_user_func_array($function, (array)$args);
}
使用此功能,您可以通过3种不同的方式调用它:
$return = InvokeFunction('doStuff');
$return = InvokeFunction('doStuff', $single_arg);
$return = InvokeFunction('doStuff', $multiple_args);
答案 2 :(得分:0)
call_user_func_array()
是最佳选择,否则请使用ReflectionFunction
。
答案 3 :(得分:0)
http://us2.php.net/create_function
使用create_function()时,直到运行时才会计算参数。很甜蜜。