Menu
Coddy logo textTech

Patron Singleton

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 71 sur 91.

Le Singleton Pattern est un patron de conception de création qui garantit qu'une classe ne possède qu'une seule instance pendant tout le cycle de vie de votre application. Il fournit également un point d'accès global à cette instance.

Ce modèle est utile lorsque vous avez besoin d’exactement un objet pour coordonner les actions dans l’ensemble du système, comme une connexion à une base de données, un gestionnaire de configuration ou un enregistreur. Créer plusieurs instances de ces objets gaspillerait des ressources ou entraînerait un comportement incohérent.

Voici comment implémenter un Singleton en PHP :

<?php
class Database {
    private static ?Database $instance = null;
    
    private function __construct() {
        // Le constructeur privé empêche l'instanciation directe
    }
    
    public static function getInstance(): Database {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function query(string $sql): string {
        return "Executing: $sql";
    }
}

$db1 = Database::getInstance();
$db2 = Database::getInstance();

echo $db1 === $db2 ? "Same instance" : "Different instances";

Sortie :

Same instance

Le modèle repose sur trois éléments clés : un constructeur privé qui empêche d’utiliser directement new, une propriété statique qui contient l’unique instance, et une méthode statique qui crée l’instance lors du premier appel et la renvoie lors des appels suivants.

Pour rendre le Singleton véritablement infaillible, vous devez également empêcher le clonage et la désérialisation :

<?php
private function __clone() {}
public function __wakeup() {
    throw new Exception("Cannot unserialize singleton");
}
challenge icon

Défi

Facile

Construisons un gestionnaire de configuration à l’aide du pattern Singleton. Dans les applications réelles, vous souhaitez généralement disposer d’une source unique de vérité pour les paramètres de configuration : plusieurs objets de configuration pourraient entraîner un comportement incohérent dans votre système.

Vous organiserez votre code sur deux fichiers :

  • Config.php : créez une classe Config qui implémente le pattern Singleton. Votre gestionnaire de configuration doit :
    • Stocker les paramètres dans une propriété de tableau privée
    • Avoir un constructeur privé qui initialise le tableau des paramètres comme vide
    • Fournir une méthode statique getInstance() qui renvoie l’instance unique
    • Empêcher le clonage en rendant __clone() privé
    • Inclure une méthode set(string $key, string $value): void pour stocker un paramètre
    • Inclure une méthode get(string $key): ?string qui renvoie la valeur d’une clé, ou null si la clé n’existe pas
    • Inclure une méthode getAll(): array qui renvoie tous les paramètres
  • main.php : incluez le fichier Config. Vous recevrez deux entrées : une clé et une valeur.

    Obtenez l’instance de Config et définissez un paramètre par défaut avec la clé "app_name" et la valeur "MyApp".

    Obtenez une seconde référence vers l’instance de Config (en utilisant à nouveau getInstance()) et utilisez-la pour définir un autre paramètre à l’aide de la clé et de la valeur provenant des entrées.

    Enfin, vérifiez que le Singleton fonctionne correctement :

    • Affichez "Same instance: true" ou "Same instance: false" selon que les deux références pointent vers le même objet (utilisez === pour les comparer)
    • Affichez "Settings count: [count]" en indiquant le nombre total de paramètres stockés (utilisez count() sur le résultat de getAll())
    • Affichez "App name: [value]" en indiquant le paramètre app_name récupéré via la seconde référence

Ce défi démontre l’avantage fondamental du pattern Singleton : quel que soit le nombre de fois où vous appelez getInstance(), vous obtenez toujours le même objet, ce qui garantit que toutes les parties de votre application partagent le même état de configuration.

Essayez vous-même

<?php

require_once 'Config.php';

// Lire l'entrée
$key = trim(fgets(STDIN));
$value = trim(fgets(STDIN));

// TODO: Obtenir l'instance de Config et définir "app_name" à "MyApp"

// TODO: Obtenir une seconde référence à Config en utilisant getInstance() à nouveau

// TODO: Utiliser la seconde référence pour définir le paramètre en utilisant $key et $value de l'entrée

// TODO: Vérifier que le Singleton fonctionne :
// - Print "Same instance: true" or "Same instance: false" based on === comparison
// - Print "Settings count: [count]" showing total settings
// - Afficher "App name: [value]" montrant app_name récupéré via la seconde référence

?>
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur PHP en ligne