En PHP, il y a des avantages à utiliser forward_static_call_array () au lieu de call_user_func_array () lorsque vous appelez dynamiquement une méthode statique?
Question
Plus précisément, est l'un plus efficace que l'autre?
La solution
Il y a au LEAT deux différences entre forward_static_call_array
et call_user_func_array
:
- La première existe que depuis PHP 5.3
- La première doit être appelée à l'intérieur d'une classe
Après cela, je suppose qu'il ya une différence qui est lié à la liaison statique tardive, qui a été introduit avec PHP 5.3.
En fait, si vous regardez de plus près l'exemple donné, il semble être exactement:. Le « contexte » de la classe à l'intérieur que vous utilisez forward_static_call_array
est « maintenu », dans la méthode appelée
Compte tenu de cette partie de code, qui est dérivé de l'exemple suivant:
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');
Vous obtiendrez cette sortie:
B
B more,args
i.e.. de la méthode dans la classe A, vous « savez », via le mot-clé static::
, que vous êtes « en provenance de B ».
Maintenant, si vous essayez de faire la même chose avec 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'));
}
}
(le reste du code ne change pas)
Vous obtiendrez cette sortie:
B
A more,args
Notez le sur la deuxième ligne! Avec forward_static_call_array
, vous n'avez pas reçu , mais B .
C'est la différence: forward_static_call_array
transmet le contexte statique à la méthode qui est appelée, alors que call_user_func_array
ne pas
A propos de votre question d'efficacité: je ne sais pas - vous auriez à référence; mais c'est vraiment pas le point. le point est que ces deux fonctions ne font pas la même chose