PHP › Guide Complet : Design Pattern Singleton
Apprenez le design pattern Singleton en PHP : créez une instance unique, centralisez vos ressources et optimisez la gestion de votre application.
Qu’est-ce qu’un design pattern ?
Lors de la conception d’une application/d’un site web, les développeurs sont confrontés à des difficultés.
Les design patterns, ou « patrons de conception », sont des solutions éprouvées à ces problèmes récurrents.
Ils permettent d’améliorer l’utilisabilité du site ou de l’application en définissant un ensemble de bonnes pratiques, de règles, testées et approuvées par des professionnels.
Lorsqu’une solution a été utilisée suffisamment souvent pour avoir fait ses preuves, on peut la proposer sous la forme d’un design pattern. Cela évite aux développeurs de réinventer la roue en créant quelque chose à partir de rien.
C’est le cas du design pattern Singleton.
La genèse du design pattern Singleton
Problématique : comment limiter l’instanciation d’une classe ?
Dans de nombreuses applications, certaines classes ne doivent jamais avoir plusieurs instances afin d’éviter :
- Une consommation mémoire inutile
- Des potentiels conflits ou incohérences
- Une complexité accrue pour accéder aux données partagées
La question se pose donc :
Comment garantir qu’une classe n’aura qu’une seule instance et fournir un accès centralisé à cette instance ?
C’est exactement le rôle du design pattern Singleton.
Réponse : le design pattern Singleton
Qu’est-ce qu’un Singleton ?
Le design pattern Singleton est un design pattern de type création. Il s’agit de l’un des patrons de conception les plus connus en programmation orientée objet.
Son but est simple : garantir qu’une seule instance d’une classe soit créée tout au long du cycle de vie d’une application, et fournir un point d’accès global à cette instance.
Il répond à deux besoins précis :
- 🔒 Limiter le nombre d’instances : une seule instance de la classe peut exister.
- 🎯 Centraliser l’accès : tous les appels passent par la même instance.
Et qui dit limiter le nombre d’instances dit gain de ressources : moins de cycles d’instanciation CPU et moins de mémoire vive (RAM) consommée.
En PHP, ce pattern est souvent utilisé pour gérer des objets sans caractéristiques uniques et largement utilisés dans l’application. Cela peut être utile pour définir :
- La connexion à une base de données
- Un gestionnaire de logs
- Une configuration globale de l’application
- Etc.
Voyons ensemble comment l’implémenter en PHP. 👇
Implémentation du Singleton en PHP
Déclaration d’une classe de Singleton
Voici une version classique du Singleton pour illustrer une connexion à la base de données :
class Database {
private static ?Database $instance = null;
private PDO $connection;
// Constructeur privé : empêche l'instanciation directe
private function __construct() {
$this->connection = new PDO("mysql:host=localhost;dbname=test", "root", "");
}
// Méthode statique pour récupérer l'unique instance
public static function getInstance(): Database {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// Accéder à la connexion PDO
public function getConnection(): PDO {
return $this->connection;
}
}
La classe Database
agit ici comme un Singleton qui encapsule la connexion PDO
, garantissant qu’une seule instance de connexion est partagée et réutilisée partout dans l’application.
Pour bien comprendre le code ci-dessus, voici un scénario type dans lequel un développeur veut exécuter une requête SQL sur la BDD.
- Il appelle
Database::getInstance()
pour récupérer l’instance unique.- Si aucune instance de
Database
n’existe (null
), alors il appelle le constructeur privé et crée la connexion PDO. - Si l’instance de
Database
existe déjà, elle est directement renvoyée.
- Si aucune instance de
- Il appelle sur cette instance la méthode
getConnection()
afin de récupérer la propriété$connection
contenant la connexion à la base de données.
Utilisation du Singleton
Côté usage de la classe, il suffit de récupérer l’instance via la méthode getInstance()
puis d’exécuter en chaîne la méthode getConnection()
.
$db1 = Database::getInstance()->getConnection();
$db2 = Database::getInstance()->getConnection();
var_dump($db1 === $db2); // true -> même instance
👉 $db1
et $db2
pointent vers le même objet, donc une seule connexion PDO
est utilisée partout ! 🙌
Le pattern Singleton en PHP est un outil puissant, mais à manier avec précaution. Il assure qu’une seule instance existe dans l’application et peut simplifier certains cas (connexion BDD, configuration…). Cependant, restez prudent dans son usage car mal utilisé, il peut nuire à la maintenabilité et à la testabilité de votre code.