Singleton(s) !

Publié dans PHP objet | Marqué avec , , , , , , ,
Share

Voilà bien longtemps que je n’avais pas fait de billets sur le PHP Objet. A vrai dire, je suis en train d’apprendre la programmation orientée objet en cours (au travers du Java et du C++), donc ça fixe vraiment les idées et permet de comprendre pas mal de petites choses, notamment l’utilité de certaines notions, comme les singletons, qui me paraissait bien douteuse auparavant. Un singleton, c’est une classe que l’on ne peut instancier qu’une seule fois. Par exemple, en cours on a créé une classe liste dont hérite la classe liste vide, et la classe listeNonVide. Clairement, il n’existe qu’une et une seule liste vide (sinon, on ne s’en sort pas), donc cette classe ne peut être instanciée qu’une seule fois, donc c’est un singleton. Je n’ai pas encore trouvé d’exemples plus parlant, par contre sur Apprendre-PHP, l’exemple est celui d’une classe PresidentDeLaRepublique qui, en effet, ne peut être instanciée qu’une seule fois)

Comment faire ?

L’idée est la suivante : le constructeur de la classe est private, on ne peut donc instancier la classe en passant directement par lui. Par contre, une variable static possède un accessor (getMachin()) qui est public et qui appelle le constructeur si la classe n’est pas encore instanciée (variable static == null), ou retourne l’instance sinon. En somme, voilà ce que ça donne :

class Singleton {
   /**
    * Variable static valant null si la classe n'est pas encore instanciée
    * ou contenant l'instance si la classe est instanciée
    * On y accède avec self::$_instance
   */
   private static $_instance = null;

   /**
    * Constructeur private inaccessible en dehors de la classe
   */
   private function __construct() {
      // On instancie ce qu'il faut
   }

   /**
    * Accessoir static, donc accessible sans être instancié, renvoyant
    * l'instance, en la créant si besoin
   */
   public static function getInstance() {
      if(self::$_instance == null) {
         self::$_instance = new Singleton();
      }
      return self::$_instance;
   }
}

Notez qu’en Java ce serait la même chose, mais sans les self::.

Bon, bah voilà, ce n’était pas si compliqué que ça !

Pour en savoir plus

Les commentaires sont fermés.