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!
两者都输出相同,但我recently hinted(仅限10k +代表)他们不等效。
那么,差异是什么?
答案 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);
这可能更多的是与使用或性能(执行)相比的实现差异。