2010-02-26 6 views

Respuesta

11

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.

Cuestiones relacionadas