Wzorzec singleton pozwala na ograniczenie liczby egzemplarzy danej klasy do jednego. Klasa albo nie ma żadnych egzemplarzy, albo ma tylko jeden, nie więcej.
Typowym zastosowaniem tego wzorca jest sytuacja, gdy tworzenie egzemplarza klasy wiąże się z dużym kosztem. Najlepszym przykładem jest klasa komunikacji z bazą danych. Zakładająć, że będziemy się komunikować z jedną bazą danych, wykorzystanie wzorca singletona będzie najlepszym rozwiązaniem.
Implementcja w php wygląda najczęśniej tak: Tworzymy statyczne pole prywatne przechowujące instancje klasy, statyczną publiczną metodę getInstance(), która zwraca nowy egzemplarz naszej klasy, a gdy jest wywoływana po raz kolejny zwraca obiekt utworzony podczas pierwszego wywołania. Deklarujemy konstruktor jako prywatny, aby zapobiec tworzeniu obiektów klasy poprzez new.
class Singleton {
private static $_instance=null;
private function __construct(){ }
public static function getInstance(){
if (self::$_instance == null){
self::$_instance = new Singleton();
}
return self::$_instance;
}
}
/** Aby utworzyć obiekt danej klasy korzystany z konstrukcji*/
$Singleton = Singleton::getInstance();
Ponieważ metoda getInstance jest statyczna, a obiekt danej klasy jeszcze nie istnieje, nie możemy się odwołać do pola $instance w taki sposób $this->_$instance. Trzeba zrobić to przez self::
Dodaj mój rss to swojego czytnika.

Wednesday, June 4, 2008 11:12 pm
Warto dodać że konstruktor (ciągle jako prywatny) można wykorzystać np. do inicjalizacji połączenia z bazą danych czy innej operacji która ma się wykonać przy pierwszym użyciu singletona. Co ważne kod konstruktora zostanie wywołany tylko raz za pierwszym pobraniem instancji.
Thursday, September 4, 2008 8:41 am
Moje skromne uwagi:
1. Do obsługi bazy danych dużo lepszym rozwiązaniem wydaje się wzorzec Factory.
2. Klasa, której kod przedstawiłeś powyżej, może posiadać więcej instancji.. zapomniałeś wspomnieć o magicznej metodzie __clone(). Należy ją przeciążyć i wyrzucić wyjątek, który spowoduje fatal error - dzięki temu mamy pewność, że w naszym systemie istnieje tylko jedna instancja danej klasy.
Friday, May 30, 2008 11:02 pm
Pierwszy wpis i od razu Singleton. Przeczytaj http://steve.yegge.googlepages.com/singleton-considered-stupid
Saturday, May 31, 2008 12:40 am
@ dr_med Tak często singleton jest uważany za anty-wzorzec. Nie nadużywamy i stosowany w odpowiedni sposób nie stanowi problemu.
Saturday, February 9, 2008 10:56 pm
Zaczynam komentowanie od starszych wpisów bo lubię czytać blogi w całości.
1. W php nie ma singletonów takich jak w np. Javie czy C++. Dlaczego? W momencie zakończenia przetwarzania skryptu niszczone są wszystkie obiekty. Biorąc pod uwagę brak stanowości dla żądania za każdym żądaniem zwracana jest nowa instancja singletonu. Można zatem powiedzieć, że w php masz singleton per request.
2. @Szymon, nie masz racji. Przyjrzyj się kodowi. Pole przechowujące instancję jest statyczne, a zatem nawet utworzenie drugiego obiektu spowoduje, że nadal będziesz miał dostęp tylko do tego jednego pola wskazującego na pierwszą instancję.
3. @dr_med, autor tego artykułu ma rację połowicznie. Z singletonami jest jak z wódką jak nadużywasz to masz problemy.