Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,当动态调用静态方法时,使用forward_static_call_array()而不是call_user_func_array()有什么优势吗?_Php_Class_Methods_Static - Fatal编程技术网

在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之后
  • 第一个必须从类内部调用
在这之后,我想有一些与后期静态绑定相关的差异,这是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
不转发


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