PHP 5.3 : Appels statiques dynamiques
Par Pascal MARTIN le jeudi 23 octobre 2008, 07:30 - Développement Web - Lien permanent
Les exemples correspondant à ce point se trouvent dans le répertoire "dynamic-static-call".
Imaginons la classe suivante, qui contient une méthode nommée methode[1], et une méthode statique nommée methodeStatique[2] :
class A { public static function methodeStatique($p1) { echo "<pre>A::methodeStatique($p1)</pre>"; } public function methode($p1) { echo "<pre>A::method($p1)</pre>"; } }
Il nous arrive fréquemment, déjà en PHP <= 5.2 d’utiliser le type de syntaxe suivante, où nous appelons une méthode sans connaitre son nom au moment de l’écriture du script :
$className = 'A'; $methodName = 'methode'; $obj = new $className(); $obj->$methodName('param1');
Au moment de l’exécution de cette portion de code, la variable $methodName vaut methode, et c’est donc la méthode de ce nom qui est appelée, provoquant l’affichage suivant :
A::methode(param1)
Mais, en PHP <= 5.2, il n’est pas possible d’utiliser le même type de syntaxe pour un méthode statique.
Typiquement, si on prend la portion de code suivante :
$staticMethodName = 'methodeStatique'; $className::$staticMethodName('param1');
Nous obtenons, avec PHP <= 5.2, une parse error :
En PHP 5.3, par contre, cet appel dynamique de méthode statique fonctionne, et nous obtenons l’affichage attendu[3] :
A::methodeStatique(param1)
Pour être averti lors de la publication de nouvelles entrées, n'hésitez pas à vous abonner au flux RSS ou ATOM des articles de mon blog !

Commentaires
En PHP 5.2 (et avant), il est possible de contourner l'erreur en utilisant :
call_user_func(array($className, $staticMethodName), 'param1');ce commentaire ^^ à propos de call_user_func est TRES juste,interessant et important !
( gare qd même à la visibilité de la fonction destination )
Snif je suis triste à l'idée de ne plus avoir la tres tres tres fameuse erreur T_PAAMAYIM_NEKUDOTAYIM :'(
Si ça te manque tant que ça, on peut toujours trouver un autre moyen d'en déclencher ^^
(Ne serait-ce qu'en utilisant
::comme séparateur d'espaces de noms, par exemple)