PHP objet : le late static binding en 5 minutes chrono

913_always_late_car_decal__04163

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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.