【问题标题】:How to call function with args array without call_user_func_array?如何在没有 call_user_func_array 的情况下使用 args 数组调用函数?
【发布时间】: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 感谢您的建议,但迁移起来会很困难 :-(

标签: php callback


【解决方案1】:

如果您使用的是 PHP 5.6,则可以在调用函数时使用 ... operator

$callable(...$args);

演示:https://3v4l.org/5KUNA

【讨论】:

  • 很好的建议,但我需要支持 PHP 5.5,而且很多用户在 5.3-5.5 上支持,而不是 5.6。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多