No PHP, existem vantagens em usar o Forward_static_call_array () em vez de call_user_func_array () ao chamar dinamicamente um método estático?
Pergunta
Especificamente, é mais eficiente que o outro?
Solução
Há em Leat duas diferenças entre forward_static_call_array
e call_user_func_array
:
- O primeiro só existe desde o Php 5.3
- O primeiro deve ser chamado de dentro de uma aula
Depois disso, suponho que haja alguma diferença relacionada à ligação estática tardia, que foi introduzida com o PHP 5.3.
Na verdade, se você analisar mais de perto o exemplo dado, parece ser exatamente isso: o "contexto" da classe dentro do qual você está usando forward_static_call_array
é "mantido", no método chamado.
Considerando esta parte do código, deriva do exemplo dado:
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');
Você obterá esta saída:
B
B more,args
ou seja, do método da classe A, você "sabe", via o static::
Palavra -chave, que você está "vindo de B".
Agora, se você tentar fazer a mesma coisa com 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'));
}
}
(o restante do código não muda)
Você obterá esta saída:
B
A more,args
Note o UMA Na segunda linha! Com forward_static_call_array
, você não conseguiu um UMA, mas a B.
Essa é a diferença: forward_static_call_array
encaminha o contexto estático para o método chamado, enquanto call_user_func_array
não.
Sobre sua pergunta de eficiência: não tenho ideia - você teria que comparecer; Mas esse não é realmente o ponto: o ponto é que essas duas funções não fazem a mesma coisa.