PHP call_user_func与仅调用函数

jay*_*jay 86 php function

我确信对此有一个非常简单的解释.这有什么区别:

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
Run Code Online (Sandbox Code Playgroud)

......这个(有什么好处?):

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
barber('mushroom');
barber('shave');
Run Code Online (Sandbox Code Playgroud)

Kai*_*Kai 84

知道它时,请始终使用实际的功能名称.

call_user_func 用于调用您不知道其名称的函数,但由于程序必须在运行时查找函数,因此效率低得多.

  • 不一定需要`call_user_func`.您总是可以使用变量函数来调用函数:`$ some_func()`.`call_user_func_array`是非常有用的. (42认同)
  • php总是需要"在运行时查找函数" (22认同)
  • “效率较低”实际上很少,尤其是从 php7 开始,大约只有几毫秒/百万次调用:https://github.com/fab2s/call_user_func (3认同)
  • @Pacerier不正确.匿名函数仍然在变量中,即`$ func = function(){};`.call_user_func的任何可能参数都必须是可调用的,这意味着它包含足够的数据来直接访问它,无论是`$ func()`,还是`$ obj - > {$ func}()`,或者其他什么. (2认同)
  • 根据一个[来源](https://bytes.com/topic/php/answers/13084-call_user_func-vs-variable-functions),“通过变量调用不存在的函数会导致致命错误,而 call_user_func( )返回警告。” 所以这是一个区别。 (2认同)

Luc*_*man 31

虽然您可以这样调用变量函数名称:

function printIt($str) { print($str); }

$funcname = 'printIt';
$funcname('Hello world!');
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您不知道您传递了多少参数.考虑以下:

function someFunc() {
  $args = func_get_args();
  // do something
}

call_user_func_array('someFunc',array('one','two','three'));
Run Code Online (Sandbox Code Playgroud)

它分别调用静态和对象方法也很方便:

call_user_func(array('someClass','someFunc'),$arg);
call_user_func(array($myObj,'someFunc'),$arg);
Run Code Online (Sandbox Code Playgroud)

  • 我知道这已经很久了,但在其他地方找不到文章.使用与$ variableFunction()相关的call_user_func('customFunction')更有利吗?有什么区别?谢谢! (7认同)

Bri*_*oth 15

call_user_func选项是有那么你可以做这样的事情:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');
Run Code Online (Sandbox Code Playgroud)

其中dynamicFunctionName字符串可以更精彩,在运行时产生的.除非必须,否则不应使用call_user_func,因为它较慢.

  • 在这种情况下,您似乎可以使用可变函数。 (3认同)

piv*_*tal 7

我想这对于调用一个你事先不知道名字的函数很有用......有点像:

switch($value):
{
  case 7:
  $func = 'run';
  break;
  default:
  $func = 'stop';
  break;
}

call_user_func($func, 'stuff');
Run Code Online (Sandbox Code Playgroud)

  • 不.我们仍然可以做`$ func('stuff');` (4认同)

mil*_*ils 5

使用 PHP 7,您可以在任何地方使用更好的变量函数语法。它与静态/实例函数一起工作,并且可以接受一组参数。更多信息请访问https://trowski.com/2015/06/20/php-callable-paradox

$ret = $callable(...$params);
Run Code Online (Sandbox Code Playgroud)