Qu'est-ce qu'un singleton ?
Par Nicolas le Dimanche 28 mai 2006, 14h28 - PHP - Lien permanent
Le singleton est un modèle de conception (design pattern pour les grands bretons). En clair c'est une façon éprouvée de résoudre un problème. Avec le sinleton on cherche à n'avoir qu'une seule instance d'un même objet.
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!

Commentaires
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)
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 ? :)