在PHP中,当动态调用静态方法时,使用forward_static_call_array()而不是call_user_func_array()有什么优势吗?
具体来说,一个比另一个更有效吗?和之间至少有两个区别:在PHP中,当动态调用静态方法时,使用forward_static_call_array()而不是call_user_func_array()有什么优势吗?,php,class,methods,static,Php,Class,Methods,Static,具体来说,一个比另一个更有效吗?和之间至少有两个区别: 第一个仅存在于PHP5.3之后 第一个必须从类内部调用 在这之后,我想有一些与后期静态绑定相关的差异,这是PHP5.3引入的 实际上,如果您仔细看一下给定的示例,它似乎正是这样的:在被调用的方法中,您正在使用forward\u static\u call\u array的类的“上下文”被“保留” 考虑到代码的这一部分,这是从给定的示例中派生出来的: class A { const NAME = 'A'; public
- 第一个仅存在于PHP5.3之后
- 第一个必须从类内部调用
实际上,如果您仔细看一下给定的示例,它似乎正是这样的:在被调用的方法中,您正在使用
forward\u static\u call\u 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
B
A more,args
i、 e.通过类A中的方法,通过static::
关键字,您“知道”您是“来自B”
现在,如果您尝试对
调用用户函数执行相同的操作:
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
B more,args
B
A more,args
注意第二行的A!使用forward\u static\u call\u array
,您没有得到A,而是得到AB
这就是区别:forward\u static\u call\u array
将静态上下文转发到被调用的方法,而call\u user\u func\u array
不转发
关于您的效率问题:我不知道——您必须进行基准测试;但这并不是重点:重点是这两个函数做的事情不同