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.

Icône de calendrier MAJ en
Intermédiaire
13 chapitres

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 :

  1. 🔒 Limiter le nombre d’instances : une seule instance de la classe peut exister.
  2. 🎯 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 :

Database.php
copié !
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.

  1. 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.
  2. 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().

copié !
$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.