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.
Ieșire: script PHP
<?php
class Config {
private static ?self $instance = null;
public string $appName;
// Privat: nimeni din afara clasei nu poate apela new Config().
private function __construct() {
echo "se încarcă configurația (se întâmplă o singură dată)\n";
$this->appName = "PromptCookbook";
}
public static function instance(): self {
return self::$instance ??= new self();
}
}
$a = Config::instance();
$b = Config::instance();
echo "aplicație: ", $a->appName, "\n";
echo "aceeași instanță: ", var_export($a === $b, true), "\n";
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.