L'implémentation de l'objet singleton consiste à créer une instance de l'objet uniquement si elle n'existe pas encore. On stocke l'instance unique dans une propriété statique de l'objet. Cela peut donner quelque chose comme cela:
<?php
class Singleton {
private static $instance = null;
private function __construct() {
}
public static function getInstance() {
if (self::$instance==null) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
?>
La théorie c'est bien joli mais j'entends déjà les questions fuser: à quoi ça sert et comment on s'en sert ? Pour répondre à la première question, je dirais qu'à chaque fois que l'on a besoin d'un objet qui doit rester unique, on utilise un singleton. Je pense par exemple à une classe de log ou une classe de debbugage.
Pour la deuxième question, voici la façon de récupérer l'instance unique:
<?php
$instance1 = Singleton::getInstance();
echo '<pre>Instance n°1:', var_dump($instance1), '</pre>';
$instance2 = Singleton::getInstance();
echo '<pre>Instance n°2:', var_dump($instance2), '</pre>';
?>
En exécutant ce code, on obtient:
Instance n°1:object(Singleton)#1 (0) { } Instance n°2:object(Singleton)#1 (0) { }
#1 est une référence vers l'instance. Dans les deux cas on a la même, ce qui est le but recherché. Au prochain épisode je vous donne un exemple concret!
1 De Sébastien -
Si mes souvenirs sont bons, les singletons sont pas mal utilisés dans le code de dotclear.
Notament dans les fonctions liées à l'affichage des templates. (exemple concret)
2 De Webdeb73 -
A quand le prochain épisode ? Un singleton est-il utile dans le cas d'une classe d'abstraction de base de données ? Je cherche à en développer une mais je ne sais pas comment m'y prendre. Un petit billet là dessus un jour ? :)