【发布时间】:2011-06-30 23:52:15
【问题描述】:
forward_static_call和call_user_func有什么区别
同样的问题也适用于forward_static_call_array 和call_user_func_array
【问题讨论】:
forward_static_call和call_user_func有什么区别
同样的问题也适用于forward_static_call_array 和call_user_func_array
【问题讨论】:
不同之处在于forward_static_call 不会重置“被调用的类”信息,如果在类层次结构中向上并显式命名一个类,而call_user_func 在这些情况下会重置信息(但仍然不会重置它,如果使用parent、static 或self)。
例子:
<?php
class A {
static function bar() { echo get_called_class(), "\n"; }
}
class B extends A {
static function foo() {
parent::bar(); //forwards static info, 'B'
call_user_func('parent::bar'); //forwarding, 'B'
call_user_func('static::bar'); //forwarding, 'B'
call_user_func('A::bar'); //non-forwarding, 'A'
forward_static_call('parent::bar'); //forwarding, 'B'
forward_static_call('A::bar'); //forwarding, 'B'
}
}
B::foo();
请注意,forward_static_call 拒绝转发 类层次结构:
<?php
class A {
static function foo() {
forward_static_call('B::bar'); //non-forwarding, 'B'
}
}
class B extends A {
static function bar() { echo get_called_class(), "\n"; }
}
A::foo();
最后,请注意forward_static_call 只能从类方法中调用。
【讨论】:
I've been a PHP developer since late 2010.
B::foo()方法不是静态的,那么所有对A::bar()的调用都会输出B。试试吧。实例化一个对象$b = new B() 并调用$b->foo()。然后将方法设为非静态并再次运行程序。