call_user_func()和$ var()之间有区别吗?

时间:2011-02-21 02:41:33

标签: php

call_user_func()与其语法糖版本之间是否存在差异......

// Global function

$a = 'max';

echo call_user_func($a, 1, 2); // 2
echo $a(1, 2); // 2

// Class method

class A {

   public function b() {
     return __CLASS__;
   }

   static function c() {
      return 'I am static!';
   }

}

$a = new A;
$b = 'b';

echo call_user_func(array($a, $b)); // A
echo $a->$b(); // A

// Static class method

$c = 'c';

echo call_user_func(array('A', $c)); // I am static!
echo a::$c(); // I am static!

codepad

两者都输出相同,但我recently hinted(仅限10k +代表)他们等效。

那么,差异是什么?

2 个答案:

答案 0 :(得分:6)

老实说,两者之间找不到太多区别。它们基本上做同样的事情,但我能找到的唯一区别是call_user_func比变量函数(调用空函数)花费的时间长2倍。

另一个问题是错误处理程序是不同的,如果你使用一个不存在的回调函数,变量函数会输出致命错误并停止脚本,而call_user_func会输出警告但继续脚本。

同样,当通过函数传递参数时,使用变量函数可以提供与行号相关的错误的更多细节:

function asdf($a, $b) {
  return(1);
}
  

call_user_func('asdf',1)

     

警告:缺少asdf()的参数2   在第3行的G:\ test.php

-

  

<强> $一个= 'ASDF'; $ a($ a,1):

     

警告:缺少参数2   asdf(),在G:\ test.php中调用   10,并在第3行的G:\ test.php中定义

这些错误是从命令行界面(CLI)测试中收集的,错误的显示显然取决于您的配置。

答案 1 :(得分:5)

我能想到的第一个区别是call_user_func()运行method作为回调。

这意味着您可以使用闭包,例如

echo call_user_func(function($a, $b) {
    return max($a, $b);
}, 1, 2);

这可能更多的是与使用或性能(执行)相比的实现差异。