Существует как минимум две разницы между forward_static_call_array
и call_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
- нет.
По поводу вашего вопроса эффективности: я понятия не имею - вам нужно будет сравнить результаты; но дело не в этом: дело в том, что эти две функции не делают одно и то же.