En PHP, ¿hay ventajas de utilizar forward_static_call_array () en lugar de call_user_func_array () al llamar dinámicamente un método estático?
Pregunta
Específicamente, es uno más eficiente que el otro?
Solución
Hay en del acueducto dos diferencias entre forward_static_call_array
y call_user_func_array
:
- El primero sólo existe a partir de PHP 5.3
- La primera de ellas se debe llamar desde el interior de una clase
Después de eso, supongo que hay alguna diferencia que está relacionado con la ligadura estática, que se introdujo con PHP 5.3.
En realidad, si se echa un vistazo más de cerca el ejemplo dado, parece ser exactamente eso:. El "contexto" de la clase dentro de la que está utilizando forward_static_call_array
se "mantiene", en el método llamado
Teniendo en cuenta esta porción de código, que se deriva del ejemplo 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');
Se conseguirá este resultado:
B
B more,args
es decir. a partir del método en la clase A, que "sabe", a través de la palabra clave static::
, que usted es "procedente de B".
Ahora, si se intenta hacer lo mismo con 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'));
}
}
(el resto del código no cambia)
Se conseguirá este resultado:
B
A more,args
Tenga en cuenta la en la segunda línea! Con forward_static_call_array
, no recibió un , pero una B .
Esa es la diferencia:. forward_static_call_array
reenvía el contexto estático con el método que se llama, mientras que no se call_user_func_array
Sobre su pregunta eficiencia: No tengo ni idea - que tendría que referencia; pero eso no es realmente el punto:. el punto es que esas dos funciones no hacen lo mismo