Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

PHP, présentation du Late State Binding

Article posté le 14-04-2016 dans la catégorie PHP

Le LSB pour "Late State Binding" est un nouveau mécanisme introduit avec PHP 5.5 qui permet de tenir compte du contexte de la classe d'appel. Pour faire simple, attaquons avec un exemple.

abstract class abstraite {
    
    protected static function afficheIdentite() {
        echo "<br/>Je suis abstraite";
    }
    
    public static function presenteToi() {
        self::afficheIdentite();
    }
    
}
class Carre extends abstraite {
    
}

class Rond extends abstraite {
    
}
$leCarre = new Carre();
$leCarre::presenteToi();
$leRond = new Rond();
$leRond::presenteToi();

Dans l'exemple ci-dessous, nos classe héritent donc d'une classe abstraite, et des méthodes qui vont avec. Tout est normal, voici le résultat qui s'affiche:

Je suis abstraite
Je suis abstraite

Maintenant, imaginons que, voulant utiliser un principe de l'héritage en POO : la réécriture d'une méthode, nous voulions donner à chacune de nos classes sa propre méthode de présentation:

class Carre extends abstraite {
    protected static function afficheIdentite() {
        echo "<br/>Je suis un carre";
    }
}

class Rond extends abstraite {
    protected static function afficheIdentite() {
        echo "<br/>Je suis un rond";
    }
}

Voici le résultat qui s'affiche:

Je suis abstraite
Je suis abstraite

Là on se dit, c'est normal, on utilise une méthode statique, qui en appelle une autre, avec le mot-clef self. Si je suis pas content, il faut aussi que je ré-écrive la méthode presenteToi().

C'est là que le LSB entre en scène. Dans notre classe abstraite, remplaçons le mot-clef self par static.

abstract class abstraite {
    
    protected static function afficheIdentite() {
        echo "<br/>Je suis abstraite";
    }
    
    public static function presenteToi() {
        static::afficheIdentite();
    }
    
}

Relançons notre script :

Je suis un carre
Je suis un rond

Et voilà! Avec le LSB, le mot static permet de tenir compte du contexte, de l'objet qui appelle la méthode statique. Dans ce cas, elle va chercher en remontant dans l'arbre généalogique de notre classe d'appel une classe qui implémente la fonction.

Modifions notre classe Rond, pour la faire hériter de la classe Carre, et donc se placer en "petite-fille" de la classe abstraite:

class Rond extends Carre {
    protected static function afficheIdentite() {
        echo "<br/>Je suis un rond";
    }
}

Résultat identique:

Je suis un carre
Je suis un rond

Résultat identique, et c'est normal, car elle a toujours sa méthode afficheIdentite(). Mais à présent, pour encore mieux illustrer ce que nous venons d'expliquer au-dessus, supprimons-lui:

class Rond extends Carre {
}

Résultat:

Je suis un carre
Je suis un carre

Et voilà. Ne trouvant pas la méthode dans la classe correspondante, PHP est remonté dans la classe parente pour voir si elle existait. S'il n'avait pas trouvé, il aurait continué, en appelant celle de la classe abstraite.


Cet article vous a plu? Découvrez d'autres articles


Tweet
comments powered by Disqus