Существует, по крайней мере, два отличия между forward _ static _ call _ array
и call _ user _ func _ array
:
После этого, я полагаю, существует некоторая разница, связанная с поздней статической привязкой
На самом деле, если присмотреться к данному примеру, кажется именно так: "контекст" класса, внутри которого вы используете 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."
Если вы попытаетесь сделать то же самое с вызовите _ 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
- нет.
Вопрос о вашей эффективности: Я понятия не имею - вам придется провести тест; но дело не в этом: суть в том, что эти две функции не выполняют одно и то же.