【发布时间】:2015-09-28 19:05:14
【问题描述】:
我需要使用参数数组调用函数,但 call_user_func_array 对我来说似乎很慢。
我尝试为此使用ReflectionFunction(请参阅code ex. 1),但也许还有另一种方法?如果该方法支持排序参数,那将是完美的(请参阅code ex. 2)
代码前。 1
private static function call(Callable $callable, array $args) {
if(class_exists('ReflectionFunction', false)) {
$r = (new ReflectionFunction($callable))->invokeArgs($args);
# ROUTES_CALLBACK_STRATEGY may be "call" or "echo"
if(defined('ROUTES_CALLBACK_STRATEGY') && strtolower(ROUTES_CALLBACK_STRATEGY) == 'call') {
return;
} else {
echo $r;
}
} else {
call_user_func_array($callable, $args);
}
}
代码前。 2
$args = array(
'param1' => 'p1',
'param2' => 'p2',
'custom_name' => 'c_n'
);
$callback = function($param, $other_param, $foo) {
echo $param . " " . $other_param . " " . $foo; // output: p1 p2 c_n
}
$callback2 = function ($custom_name, $param1, $param2) {
echo $custom_name . " " . $param1 . " " . $param2; // output: c_n p1 p2
}
感谢帮助。
【问题讨论】:
-
call_user_func_array是“慢”是什么意思? -
@RocketHazmat 使用
call_user_func_array比直接调用函数 (function()) 慢 124%,使用ReflectionFunction调用慢 109%。 -
在 PHP 5.6 之前,
call_user_func_array似乎是要走的路。不确定任何其他方法(除了ReflectionFunction,我一直认为它更慢)。 -
您可以在可调用对象中使用
func_get_args -
@ElefantPhace 感谢您的建议,但迁移起来会很困难 :-(