In PHP, ci sono dei vantaggi ad usare forward_static_call_array () al posto di call_user_func_array () quando si chiama in modo dinamico un metodo statico?
Domanda
In particolare, è una più efficiente rispetto agli altri?
Soluzione
Non v'è almeno di due differenze tra forward_static_call_array
e call_user_func_array
:
- La prima esiste solo dal PHP 5.3
- Il primo deve essere chiamato dall'interno di una classe
Dopo di che, suppongo che ci sia qualche differenza che è legato al ritardo binding statico, che è stato introdotto con PHP 5.3.
In realtà, se si dà un'occhiata più da vicino l'esempio dato, sembra che sia esattamente questo:. Il "contesto" della classe all'interno della quale si sta utilizzando forward_static_call_array
è "mantenuto", nel metodo chiamato
Considerando questa porzione di codice, che è derivato dal esempio fornito:
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');
Si otterrà questo output:
B
B more,args
vale a dire. dal metodo in classe A, si "sa", tramite la parola chiave static::
, che si sta "venendo da B".
Ora, se si tenta di fare la stessa cosa con la 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'));
}
}
(il resto del codice non cambia)
Si otterrà questo output:
B
A more,args
Si noti la A sulla seconda linea! Con forward_static_call_array
, non ha ottenuto un A , ma un B .
Questa è la differenza: forward_static_call_array
inoltra contesto statico per il metodo che si chiama, mentre call_user_func_array
no
A proposito di tua domanda efficienza: non ho idea - sarebbe necessario punto di riferimento; ma questo è davvero non è il punto. Il punto è che queste due funzioni non fanno la stessa cosa