Design pattern : un Singleton PHP (par Bruno Vibert, Netapsys)

Design pattern : un Singleton PHP Le design pattern Singleton permet de s'assurer qu'une classe n'est instanciée qu'une seule fois durant toute l'exécution d'un script. Décryptage.

Le design pattern Singleton vous permet, en tant que développeur, de vous assurer qu'une classe n'est instanciée qu'une seule fois durant toute l'exécution de votre script. Ce cas de figure se présente notamment lorsqu'il s'agit de stocker une connexion à une base de données ou de charger un fichier de configuration.

Voici un gabarit simple et commenté qui vous permettra de maitriser le concept... pour ceux qui ne le savent pas déjà !


Le concept de base et d'interdire toute instanciation de la classe par ce type de code :


<?php
$firstClassInstance    = new SingletonClass();
$secondClassInstance   = new SingletonClass();
?>



Pour ce faire, nous allons rendre "privé" le constructeur de notre classe (oui, c'est possible), ce qui nous donne quelque chose comme ça :

<?php
class SingletonClass {

   private function __construct()
   {}

}?>


Très bien. Maintenant, il va quand même falloir l'instancier une (et une seule) fois, cette classe ! C'est la que les méthodes et propriétés statiques viennent à notre secours. Nous allons stocker, dans une propriété statique et privée de notre classe une instance d'elle même, que nous allons distribuer, en l'instanciant si elle est nulle (au premier appel donc).


Voici le code :

 <?php
/**
 * Démonstration du design pattern Singleton
 *
 * @author bruno.vibert
 */
class SingletonClass {

   /**
    *
    * @var SingletonClass
    */
   private static $_instance;

   private function __construct()
   {}

   /**
    * Récupère l'instance de la classe
    *
    * @return SingletonClass
    */
   public static function getInstance()
   {
       if( true === is_null( self::$_instance ) )
       {
           self::$_instance = new self();
       }

       return self::$_instance;
   }
}

?>




Le tour est joué ! Pour accéder à l'instance de la classe dans votre code :



<?php
$firstClassInstance   = SingletonClass::getInstance();
$sameClassInstance   = SingletonClass::getInstance();
?>


Bruno Vibert est responsable du pôle Web de la société de services informatiques Netapsys.


Serveur d'applications / Design