Använda singletons
i PHP anses vara dålig praxis. Enligt min erfarenhet är det mest problematiska problemet med dem enhetstester. Det är svårt att säkerställa att två tester är oberoende när man testar singlar.
Jag skulle delegera ansvaret för begränsningen "bara en instans bör existera" till koden som skapar Db-objektet.
Också för mig ser det ut som att det finns ett missförstånd i hur Singletons fungerar i PHP i motsats till andra språk:Om du till exempel har 10 000 samtidiga förfrågningar, så körs varje förfrågan i en separat PHP-process eller tråd, vilket betyder att de alla kommer att ha sina egna instans av "singleton", det finns ingen delning av detta objekt för mer än en enda begäran (när PHP körs i vanliga webbbackend-scenarier)
Det finns ingen "connection pooling" i PHP, men du kan använda mysqli
beständiga anslutningar för mysql. Det kan uppnås genom att skicka p:
framför värdnamnet när du skapar mysqli. Det här kan hjälpa här, men hantera det med försiktighet (vilket innebär att läs dokumentationen först )
Men bara för teorin måste en singel i PHP vara medveten om det faktum att någon kan använda clone
. Det betyder att det i ditt fall skulle vara möjligt att göra det:
$db = DB::getInstance();
$db2 = clone $db;
För att undvika det kan du implementera __clone()
metod så här:
public function __clone() {
throw new Exception("Can't clone a singleton");
}