PHP 5.3 : Appels statiques dynamiques

23 octobre 2008php, php-5.3, static
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

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 :

dynamic-static-call-5.2.png

En PHP 5.3, par contre, cet appel dynamique de méthode statique fonctionne, et nous obtenons l'affichage attendu[3] :

A::methodeStatique(param1)


Notes

[1] Non, pas original...

[2] Je vous avais dit : pas original !

[3] Du moins, l'affichage auquel nous aurions déjà eu tendance à nous attendre ^^