在PHP中,动态调用静态方法时使用forward_static_call_array()而不是call_user_func_array()有什么优点吗?

StackOverflow https://stackoverflow.com/questions/2343974

  •  23-09-2019
  •  | 
  •  

具体来说,一个比另一个更有效率吗?

有帮助吗?

解决方案

之间至少有两个区别 forward_static_call_arraycall_user_func_array :

  • 第一个仅从 PHP 5.3 开始存在
  • 第一个必须从类内部调用

之后,我认为存在一些与 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

IE。从 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, ,但是一个 .

这就是区别: forward_static_call_array 将静态上下文转发到被调用的方法,而 call_user_func_array 没有。


关于您的效率问题:我不知道——你必须进行基准测试;但这确实不是重点:关键是这两个函数不做同样的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top