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 instanceLe 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");
}
Défi
FacileConstruisons 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 classeConfigqui 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): voidpour stocker un paramètre - Inclure une méthode
get(string $key): ?stringqui renvoie la valeur d’une clé, ounullsi la clé n’existe pas - Inclure une méthode
getAll(): arrayqui 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 (utilisezcount()sur le résultat degetAll()) - Affichez
"App name: [value]"en indiquant le paramètre app_name récupéré via la seconde référence
- Affichez
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
?>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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne