【发布时间】:2011-01-21 14:04:35
【问题描述】:
具体来说,一个比另一个更有效吗?
【问题讨论】:
具体来说,一个比另一个更有效吗?
【问题讨论】:
forward_static_call_array 和 call_user_func_array 之间至少有两个区别:
在那之后,我想有一些与后期静态绑定相关的差异,它是在 PHP 5.3 中引入的。
实际上,如果您仔细查看给定的示例,似乎正是这样:您在其中使用forward_static_call_array 的类的“上下文”在被调用的方法中是“保留的”。
考虑到这部分代码,它源自给定的示例:
class A {
const NAME = 'A';
public static function test() {
$args = func_get_args();
echo static::NAME, " ".join(',', $args)." \n"; // Will echo B
}
}
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
forward_static_call_array(array('A', 'test'), array('more', 'args'));
}
}
B::test('foo');
你会得到这个输出:
B
B more,args
即从 A 类的方法中,您通过 static:: 关键字“知道”您“来自 B”。
现在,如果您尝试对 call_user_func 做同样的事情:
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
call_user_func_array(array('A', 'test'), array('more', 'args'));
}
}
(其余代码不变)
你会得到这个输出:
B
A more,args
注意第二行的A!使用forward_static_call_array,您得到的不是A,而是B。
这就是区别:forward_static_call_array 将静态上下文转发给被调用的方法,而 call_user_func_array 不会。
关于您的效率问题:我不知道-您必须进行基准测试;但这真的不是重点:重点是这两个函数做的事情不一样。
【讨论】: