Específicamente, ¿es uno más eficiente que el otro?En PHP, ¿hay alguna ventaja de usar forward_static_call_array() en lugar de call_user_func_array() cuando se llama dinámicamente a un método estático?
Respuesta
Hay al leat dos diferencias entre forward_static_call_array
y call_user_func_array
:
- El primero sólo existe a partir de PHP 5.3
- El primero debe ser llamado desde el interior de una clase
Después de eso , Supongo que hay alguna diferencia relacionada con el enlace estático tardío, 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 cual está utilizando forward_static_call_array
está "guardado", 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');
que obtendrá esta salida:
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 "viene 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)
que obtendrá esta salida :
B
A more,args
Nota del Un en la segunda línea! Con forward_static_call_array
, no obtuvo un A, sino un B.
Esa es la diferencia: forward_static_call_array
reenvía el contexto estático al método que se llama, mientras que call_user_func_array
no lo hace.
Acerca de su pregunta de eficiencia: No tengo ni idea, tendría que comparar; pero ese no es realmente el punto: el punto es que esas dos funciones no hacen lo mismo.
- 1. ¿Hay alguna ventaja de usar null primero en PHP?
- 2. ¿Hay alguna ventaja de usar '<< 1' en lugar de '* 2'?
- 3. ¿Hay alguna ventaja al usar selectores muy específicos en CSS?
- 4. ¿Hay alguna ventaja en un If/Else anidado en lugar de Else If?
- 5. ¿Qué sucede cuando llamas a un método estático en C#?
- 6. Método de ejecución (mágico) cuando se llama el método existente
- 7. ¿El método estático en PHP tiene alguna diferencia con el método no estático?
- 8. ¿Hay alguna ventaja en compilar un ensamblaje como x64?
- 9. ¿Hay alguna ventaja al usar AND y OR sobre && y || en PHP?
- 10. ¿Cómo invoco dinámicamente un método de clase en PHP?
- 11. ¿Hay alguna razón para usar SGML en lugar de XML?
- 12. Llamada a un método estático dinámico en PHP?
- 13. ¿Por qué un delegado no puede hacer referencia a un método no estático cuando se usa en un método estático?
- 14. Forma maravillosa de invocar dinámicamente un método estático
- 15. ¿Hay alguna ventaja en agrupar consultas de medios css juntas?
- 16. ¿Hay alguna manera de obtener el tamaño de un archivo en .NET usando un método estático?
- 17. @synchronized en un método estático
- 18. ¿Llamar método estático de instancia en PHP, desaprobación futuro?
- 19. ¿Hay alguna ventaja de usar palabra clave volátil en contraste para usar la clase Interbloqueado?
- 20. ¿Cómo se pasan los parámetros por ref cuando se llama a un método estático mediante la reflexión?
- 21. ¿Hay alguna ventaja de volver a hashtar contraseñas almacenadas en el momento del inicio de sesión?
- 22. call_user_func_array pasando argumentos a un constructor
- 23. ¿Cuándo se llama un constructor estático en C#?
- 24. C#: ¿Qué ocurre si se llama a un método estático desde varios subprocesos?
- 25. ¿Hay alguna alternativa a cambiar en un método de fábrica?
- 26. ¿Hay alguna forma de acceder dinámicamente a un superglobal?
- 27. ¿Hay alguna ventaja en usar parámetros const con un tipo ordinal?
- 28. Llamar a un método estático en C#
- 29. ¿Puedo acceder a un método estático en una clase especificada dinámicamente en Perl?
- 30. Anulación de un método estático en Python