Le Design Pattern Singleton en PHP

Pour inaugurer la section Design Pattern & PHP, je voudrais le singleton. En effet, quoi de mieux qu’un pattern décrié et critiqué à tout va…. et pourtant au combien simple à appréhender ?

La problématique

S’assurer que seule et une seule instance d’une classe soit utilisée.

La solution

Rendre le constructeur de la classe privé puis créer une méthode statique dont la charge est de toujours fournir le même objet.

Exemple d’implémentation

/**
* Cette classe ne devra avoir qu'une seule instance
* dans toute l'application
*/
class ApplicationConfiguration {
   /**
    * Cette propriété statique servira de variable d'instance.
    * La méthode de construction utilisera cette
    * dernière afin d'y sauvegarder / récupérer l'instance unique.
    */
   private static $_instance = false;

   /**
    * On indique que le constructeur est privé pour éviter
    * toute instanciation non maîtrisée
    */
   private function __construct (){
      //chargement du fichier de configuration
   }

   /**
    * On évite tout clonage pour ne pas avoir deux instances en //
    */
   private function __clone (){}

   /**
    * C'est la méthode qui "remplace" le constructeur vis à vis
    * des autres classes.
    *
    * Son rôle est de créer / distribuer une unique
    * instance de notre objet.
    */
   public static function getInstance (){
      //Si l'instance n'existe pas encore, alors elle est créée.
      if (self::$_instance === false){
         self::$_instance = new ApplicationConfiguration ();
      }
      //L'instance existe, on peut la retourner à l'extérieur.
      return self::$_instance;
   }
}

EDIT 18/01/2010 => Ajout de la méthode __clone () privée pour éviter le clonage

  1. Autoloader Universel – Jouons avec les Patterns | Gerald's Blog - pingback on 7 décembre 2010 at 17 h 06 min
  2. La Stratégie (Strategy) en PHP | Gerald's Blog - pingback on 29 décembre 2010 at 14 h 44 min
  3. Singleton, Multiton et alternatives | Gerald's Blog - pingback on 19 janvier 2011 at 11 h 19 min
  4. Les registres (Registry) en PHP | Gerald's Blog - pingback on 10 juin 2011 at 7 h 43 min
  5. Testez votre code avec Atoum | Gerald's Blog - pingback on 2 août 2011 at 13 h 57 min
  6. bonjour

    Le Singleton est en effet tres pratique.
    En revanche il peut etre piégeux. J’en ai fait l’expérience.

    1. gestionnaire DB
    j’ai voulu créer le getter a un DB Manager de base de données par Singleton pour une appli. Marche nickel.
    Puis dans la meme appli j’avais besoin de ce meme Manager mais qui pointe vers une autre DB. J’ai voulu le réutiliser, via héritage. Puis j’ai surchargé le getter de sorte qu’il affecte la $_instance propre à la classe héritante, pour éviter tout écrasement.
    Bug : la surcharge dans un contexte statique fonctionne pas en PHP5.3

    2. garbage collector :
    Pour libérer la mémoire, le GC intervient sur des objets, des instances. Or un Singleton agit en contexte statique.
    Ca peut donc laisser des résidus en mémoire.

    3. multi-threading
    PHP suit le principe d’architecture non partagée. Ya donc pas de partage du Singleton entr thrad executé en parallele. Il faut un systeme de Lock.
    Mais il existe une alternative : le module Semaphore pour PHP.

Laisser un commentaire


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackbacks and Pingbacks: