Pas*_*TIN 11

forward_static_call_array和之间存在两个差异call_user_func_array:

  • 第一个仅存在于PHP 5.3之后
  • 必须从类中调用第一个

之后,我认为与PHP 5.3引入的Late Static Binding有一些区别.


实际上,如果你仔细看看给定的例子,它似乎就是这样:你所使用的类的"上下文" 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');
Run Code Online (Sandbox Code Playgroud)

你会得到这个输出:

B
B more,args
Run Code Online (Sandbox Code Playgroud)

也就是说,从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'));
    }
}
Run Code Online (Sandbox Code Playgroud)

(其余代码不会改变)

你会得到这个输出:

B
A more,args
Run Code Online (Sandbox Code Playgroud)

注意第二行的A!有了forward_static_call_array,你没有得到的一个,但.

这就是区别:forward_static_call_array将静态上下文转发给被调用的方法,而call_user_func_array不是.


关于你的效率问题:我不知道 - 你必须做基准测试; 但这真的不是重点:关键是这两个函数不做同样的事情.