Top, c’est parti ! Tout d’abord, qu’est-ce que le late static binding (résolution statique à la volée), me direz-vous ? C’est un mécanisme qui, dans un contexte d’appel statique, permet de faire référence à la classe courante (la « vraie » classe). Voici comment nous faisions (avant PHP 5.3) dans un contexte d’héritage statique (A a une méthode statique dont B hérite tout en l’écrasant – même si elle est identique à l’originale) :
class A { public function pointDentree() { self::methode(); } public static function methode() { echo __CLASS__, PHP_EOL; } } class B extends A { public static function methode() { echo __CLASS__, PHP_EOL; } } $b = new B; $b->pointDentree();
Nous instancions un objet de la classe B, nous nous attendons donc à avoir « B » affiché à l’écran or c’est A qui s’affiche, signe que la résolution statique ne se fait pas au runtime (exécution) mais à la définition de la classe (compilation). Pour obtenir le comportement attendu, il suffit de faire usage du mot clé static :
class A { public function pointDentree() { static::methode(); } public static function methode() { echo __CLASS__, PHP_EOL; } } class B extends A { public static function methode() { echo __CLASS__, PHP_EOL; } } $b = new B; $b->pointDentree();
Ici j’ai bien B qui s’affiche ! PHP nous donne les raisons de la limitation du mot clé self :
Les références statiques à la classe courante, avec self:: ou __CLASS__, sont résolues en utilisant la classe à laquelle appartiennent les fonctions, celle où elles ont été définies (source : http://php.net/manual/fr/language.oop5.late-static-bindings.php)
Utilisez donc à bon escient ce mécanisme de late static binding dans vos développements, un effet de bord est si vite arrivé quand on fait de l’héritage statique !