Pattern Singleton
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 71 di 91.
Il Singleton Pattern è un pattern di progettazione creazionale che garantisce che una classe abbia una sola istanza per tutto il ciclo di vita della tua applicazione. Fornisce anche un punto di accesso globale a tale istanza.
Questo schema è utile quando hai bisogno di esattamente un oggetto per coordinare le azioni nell’intero sistema, come una connessione al database, un gestore della configurazione o un logger. Creare più istanze di questi oggetti sprecherebbe risorse o causerebbe comportamenti incoerenti.
Ecco come implementare un Singleton in PHP:
<?php
class Database {
private static ?Database $instance = null;
private function __construct() {
// Il costruttore privato impedisce l'istanziazione diretta
}
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";
Output:
Same instanceLo schema si basa su tre elementi chiave: un costruttore privato che impedisce di usare direttamente new, una proprietà statica che contiene l’unica istanza e un metodo statico che crea l’istanza alla prima chiamata e la restituisce alle chiamate successive.
Per rendere il Singleton davvero a prova di errore, dovresti anche impedire la clonazione e la deserializzazione:
<?php
private function __clone() {}
public function __wakeup() {
throw new Exception("Cannot unserialize singleton");
}
Sfida
FacileCreiamo un gestore della configurazione usando il Pattern Singleton. Nelle applicazioni reali, in genere vuoi un'unica fonte attendibile per le impostazioni di configurazione: avere più oggetti di configurazione potrebbe causare comportamenti incoerenti nel sistema.
Organizzerai il codice in due file:
Config.php: crea una classeConfigche implementa il Pattern Singleton. Il gestore della configurazione dovrebbe:- Memorizzare le impostazioni in una proprietà array privata
- Avere un costruttore privato che inizializza l'array delle impostazioni come vuoto
- Fornire un metodo statico
getInstance()che restituisce l'unica istanza - Impedire la clonazione rendendo privato
__clone() - Includere un metodo
set(string $key, string $value): voidper memorizzare un'impostazione - Includere un metodo
get(string $key): ?stringche restituisce il valore di una chiave, oppurenullse la chiave non esiste - Includere un metodo
getAll(): arrayche restituisce tutte le impostazioni
main.php: includi il file Config. Riceverai due input: una chiave e un valore.Ottieni l'istanza di Config e imposta un'impostazione predefinita con la chiave
"app_name"e il valore"MyApp".Ottieni un secondo riferimento all'istanza di Config (usando di nuovo
getInstance()) e usalo per impostare un'altra impostazione usando la chiave e il valore degli input.Infine, verifica che il Singleton funzioni correttamente:
- Stampa
"Same instance: true"oppure"Same instance: false"a seconda che entrambi i riferimenti puntino allo stesso oggetto (usa===per confrontarli) - Stampa
"Settings count: [count]"mostrando il numero totale di impostazioni memorizzate (usacount()sul risultato digetAll()) - Stampa
"App name: [value]"mostrando l'impostazione app_name recuperata tramite il secondo riferimento
- Stampa
Questa sfida dimostra il vantaggio fondamentale del Pattern Singleton: non importa quante volte chiami getInstance(), ottieni sempre lo stesso oggetto, assicurando che tutte le parti della tua applicazione condividano lo stesso stato di configurazione.
Provalo tu
<?php
require_once 'Config.php';
// Leggi l'input
$key = trim(fgets(STDIN));
$value = trim(fgets(STDIN));
// TODO: Ottieni l'istanza di Config e imposta "app_name" su "MyApp"
// TODO: Ottieni un secondo riferimento a Config usando di nuovo getInstance()
// TODO: Usa il secondo riferimento per impostare la configurazione con $key e $value ricevuti in input
// TODO: Verifica che Singleton funzioni:
// - Stampa "Same instance: true" o "Same instance: false" in base al confronto ===
// - Stampa "Settings count: [count]" mostrando il numero totale di impostazioni
// - Stampa "App name: [value]" mostrando app_name recuperato tramite il secondo riferimento
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online