Treci la conținutul principal

Ce este

Șablonul Singleton se asigură că o clasă are exact o instanță în întreg programul și oferă tuturor același punct de acces la ea. Singletonuri tipice: o configurație, un ansamblu de conexiuni (connection pool), un jurnalizator (logger).

Instrumentul PHP pentru asta este un constructor privat plus o metodă statică instance(): nimeni din afara clasei nu poate apela new, iar unicul punct de acces creează instanța la primul apel. Deoarece PHP execută fiecare cerere în propriul proces izolat, „una pentru întreg programul” înseamnă una pe cerere — sau una pe fiecare rulare a unui script din linia de comandă.


Exemplu: o singură configurație pentru toți

Configurația este încărcată la primul apel Config::instance() și niciodată după aceea. Fiecare apelant primește același obiect.

Încărcare o singură dată, în spatele unui constructor privat

Linia „se încarcă configurația” este afișată o singură dată, deși instance() este apelată de două ori — iar $a === $b dovedește că ambii apelanți dețin aceeași instanță. Operatorul ??= creează obiectul doar atunci când proprietatea este încă null.

Prompt
Scrie un script PHP cu un singleton Config: un constructor privat care afișează o linie în timp ce încarcă, o proprietate statică privată pentru instanță și o metodă publică statică instance() care creează obiectul doar la primul apel, folosind operatorul ??=. Apelează instance() de două ori, afișează numele aplicației și demonstrează că ambele apeluri returnează același obiect printr-o comparație de identitate.
Ieșire: script PHP

Când să îl folosești

Folosește-l atunci când cu adevărat trebuie să existe un singur exemplar al unui lucru: o singură configurație încărcată, un singur ansamblu de conexiuni, un singur cache — și crearea lui este costisitoare sau duplicatele ar intra în conflict.

Renunță la el atunci când poți crea pur și simplu valoarea la începutul scriptului și o poți transmite celor care au nevoie de ea. Transmiterea deschisă a dependențelor este mai clară decât accesul global — singletonul este ultima soluție, nu prima.


Avantaje și dezavantaje

Avantaje: instanță unică garantată — constructorul privat blochează orice new rătăcit; creare leneșă la prima utilizare; un singur punct de acces evident.

Dezavantaje: este o variabilă globală deghizată — dependențele ascunse fac codul mai greu de urmărit; testele nu îl pot înlocui ușor cu un dublu fals; folosirea excesivă duce la programe încurcate.