【问题标题】:Alternative to call_user_func_array [closed]替代 call_user_func_array [关闭]
【发布时间】:2013-02-25 07:17:02
【问题描述】:

我必须在我的 PHP 脚本中使用 call_user_func_array()。虽然它看起来非常慢。有其他选择吗?

【问题讨论】:

  • 显示你如何使用它的上下文。
  • 参数是否需要在数组中,还是call_user_func() 就足够了?
  • “虽然看起来非常慢” - 你是如何衡量的?

标签: php performance optimization


【解决方案1】:

使用call_user_func_array 与直接调用函数在性能上存在差异,但并没有那么大(大约慢 15 倍)。除非您使用它数千次,否则您不会注意到它。

要回答您的问题,您可以自己构建一个:

function call($fn, array $args = array()){

  $numArgs = count($args);

  if($numArgs < 1)
    return $fn();

  if($numArgs === 1)  
    return $fn($args[0]);

  if($numArgs === 2)  
    return $fn($args[0], $args[1]);

  // ...

  return call_user_func_array($fn, $args);
}

还有ReflectionFunction::invokeArgs(和ReflectionMethod::invokeArgs):

$reflector = new ReflectionFunction($fn);
return $reflector->invokeArgs($args);

另一种解决方案(可能是最好的解决方案)是让您的函数接受带有参数的数组...

【讨论】:

  • 不应该认为ReflectionFunctioncall_user_func_array 慢。
  • 我使用了一个类似的函数,它在特征中使用switch( count($args) ),并在最终默认为call_user_func_array 作为默认值之前处理多达14 个参数。它的基准测试比call_user_func_array 快得多,也比使用反射器快得多。我认为我从未见过它达到默认值。它必须是一个荒谬的无法使用的功能才能达到那么远。
  • @mopsyd:不错的方法!
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2010-09-22
  • 1970-01-01
  • 2012-06-16
  • 2011-06-16
  • 2021-04-16
  • 2014-11-30
  • 2011-12-17
相关资源
最近更新 更多