Ça changera en PHP 5.3, mais pour l'instant, voici comment PHP traite tout ça :
- quand on écrit class::constante, class est de type T_STRING et constante de type T_STRING ;
- quand on écrit class::$attribute, class est de type T_STRING et $attribute de type T_VARIABLE ;
- quand on écrit class::methode(), class est de type T_STRING et methode de type T_STRING ou T_VARIABLE.
C'est à dire que tu peux appeler une méthode façon dynamique :
class A {
public static function method ( ) {
return 'methode';
}
}
$m = 'method';
var_dump(A::method());
var_dump(A::$m());
Par contre, on note que la classe est
invariablement de type
T_STRING (à ne surtout pas confondre avec
T_CONSTANT_ENCAPSED_STRING qui est une chaîne de caractères à proprement parler). Donc impossible de rendre ça dynamique.
En PHP 5.3, ce sera possible (yepee).
Donc il te reste deux solutions : appels dynamiques (
callback) ou introspection (
reflection). À mon avis, les appels dynamiques sont plus rapides que l'introspection car l'introspection va regarder le «
bytecode » et agir en conséquence. Cette opération est plus lourde qu'un appel dynamique.
Après relecture : oops, il te reste bien sûr la possibilité d'appeler ta méthode statique directement sur l'objet (qui en fait va rediriger sur la classe). Lors de l'utilisation du mot-clé
new, on doit préciser le nom de la classe qui est soit de type
T_STRING soit …
T_VARIABLE ! Donc on peut avoir du dynamisme à cet endroit :
// Suite du code précédent.
$a = 'A';
var_dump(new A());
var_dump(new $a());
Donc tu peux faire un truc du genre :
$object = new $class();
$return = $object->$method();
ça reste possible. Par contre, pas sûr que d'instancier une classe soit
systématiquement plus rapide que d'utiliser des appels dynamiques … À voir

.
Conclusion partielle : comme ta classe est dynamique, les appels dynamiques peuvent être nécessaires, donc utiliser call_user_func() se justifie très bien

.