Есть ли в PHP какие-либо преимущества использования front_static_call_array() вместо call_user_func_array() при динамическом вызове статического метода?
Вопрос
В частности, является ли один более эффективным, чем другой?
Решение
Существует как минимум два различия между 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
то естьиз метода класса А, вы «знаете», через static::
ключевое слово, что вы «пришли из Б».
Теперь, если вы попытаетесь сделать то же самое с 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
Обратите внимание А на второй линии!С forward_static_call_array
, ты не получил А, но Б.
Вот в чем разница: forward_static_call_array
пересылает статический контекст вызываемому методу, в то время как call_user_func_array
нет.
О вашем вопросе эффективности:Понятия не имею - вам придется провести тест;но суть не в этом:дело в том, что эти две функции не делают одно и то же.