Design pattern : Un Singleton PHP

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_nullself::$_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();
?>

5 commentaires

  1. Dans le cas présent cela pourrait suffire en effet. Mais je trouve cette syntaxe plus lisible. Tu la retrouveras très régulièrement dans des framworks récents (comme ZF par exemple).

  2. Je ne suis pas expert en php mais je pense que cette solution pourrait fonctionner aussi :

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

    /**
    *
    * @var SingletonClass
    */
    private static $_instance = new self();

    private function __construct()
    {}

    /**
    * Récupère l’instance de la classe
    *
    * @return SingletonClass
    */
    public static function getInstance()
    {
    return self::$_instance;
    }
    }
    ?>

  3. Bien tenté, mais non. Il faut, en PHP, que tu instancies ta class à un moment. La propriété private::$_instance étant nulle, le return self::$_instance renverra toujour null.

  4. C’est pour cela que « = new self(); »
    est ajouté après « private static $_instance »
    L’instanciation de l’objet se fait donc au premier appel de la classe.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.