What is the difference between forward_static_call
and call_user_func
And the same question applies to forward_static_call_array
a
The difference is just that forward_static_call
does not reset the "called class" information if going up the class hierarchy and explicitly naming a class, whereas call_user_func
resets the information in those circumstances (but still does not reset it if using parent
, static
or self
).
Example:
<?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();
Note that forward_static_call
refuses to forward if going down the class hierarchy:
<?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();
Finally, note that forward_static_call
can only be called from within a class method.