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?

StackOverflow https://stackoverflow.com/questions/2343974

  •  23-09-2019
  •  | 
  •  

Pregunta

Específicamente, es uno más eficiente que el otro?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top