samedi 29 août 2009
Le pattern de création singleton permet de s'assurer qu'il existe une seule instance d'un objet à l'intérieur du projet. Et d'autres mots, le constructeur est privé, ce qui veut dire qu'on ne peut en aucun cas appeler "new" sur la classe pour obtenir de multiples copies. Comme la méthode est statique, il n'y a pas d'instance à manipuler, on ne fait que la récupérer.
Voici un gabarit de base de la structure du singleton sur lequel on pourra développer :
class Singleton{Déclaration statique ou non ?
private static $_instance = false;
private function __construct(){
echo 'chargement des valeurs par défaut';
}
public static function getInstance(){
if( self::$_instance === false ){
self::$_instance = new Singleton();
}
return self::$_instance;
}
}
- la classe ne doit pas être déclarée statique
- la propriété $_instance doit être statique
- la méthode getInstance() doit être statique
En rendant le constructeur privé, on empêche la classe d'être instanciée à l'extérieur de l'objet. Autrement dit, l'objet peut être créé uniquement à l'intérieur de lui-même.
La ligne suivante provoquera une erreur du type "Call to private Singleton::__construct() from invalid context..." :
$obj = new Singleton();Pour récupérer l'instance de l'objet singleton, on devra utiliser :
$obj = Singleton::getInstance();Mise en garde
Avant d'utiliser ce gabarit de conception, assurez-vous de réfléchir adéquatement à son application. Je vous suggère une lecture complémentaire très pertinente sur l'utilisation des singletons : Êtes-vous atteint de singletonite ?
Personnellement, j'ai pris la (mauvaise ?) habitude de rajouter une fonction globale qui me simplifie l'instanciation comme l'utilisation :
function myObject()
{
static $obj;
if ( !$obj )
{
$obj = Singleton::getInstance();
}
return $obj;
}
Il ne me reste plus qu'à utiliser mon object sans avoir à le stocker dans une variable locale ni même avoir à me soucier de son existence :
myObject()->myMethod($args);
myObject()->etc();