forward_static_call_array和
call_user_func_array之间有两个差异:
>第一个仅存在于PHP 5.3之后
>第一个必须从一个类里面调用
之后,我想有一些与Late 5.3静态绑定有关的差异.
实际上,如果你仔细看看给定的例子,似乎正是这样:你所使用的类的“context”在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则没有.
关于你的效率问题:我不知道 – 你必须进行基准测试;但这不是重点:关键在于这两个功能不会做同样的事情.