【问题标题】:In PHP, are there any advantages to using forward_static_call_array() instead of call_user_func_array() when dynamically calling a static method?在 PHP 中,动态调用静态方法时使用 forward_static_call_array() 而不是 call_user_func_array() 有什么好处吗?
【发布时间】:2011-01-21 14:04:35
【问题描述】:

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

【问题讨论】:

    标签: php class methods static


    【解决方案1】:

    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
    

    即从 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 不会。


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

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 2017-01-18
      • 2021-04-10
      • 2011-01-06
      • 2011-12-11
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多