Programowanie obiektowe w PHP #4 - Obiekt singleton
Witajcie! Część z Was już pewnie straciła nadzieję na kontynuację cyklu, ponieważ ostatni jego odcinek ukazał się ponad dwa miesiące temu. Znalazłem jednak chęci i czas i powracam.
W dzisiejszym odcinku nauczymy się, co to jest klasa definiująca obiekty singleton, keidy takowe się przydają i jak stworzyć taką klasę.
Co to jest singleton?
Singleton, to typ obiektu, który może istnieć tylko w jednym egzemplarzu. Normalnie możemy stworzyć dowolną liczbę obiektów korzystając z operatora new. Przy tworzeniu obiektów singleton nie korzystamy z operatora new, ale ze specjalnej statycznej metody.
Kiedy przydaje się obiekt singleton?
Singleton stosuje się tam, gdzie tworzenie większej liczby obiektów tej samej klasy nie ma sensu lub tworzenie większej liczby obiektów tej klasy wiąże się z dużym zużyciem pamięci operacyjnej. Ja za przykład podam klasę, która służy do przetwarzania zapytania do serwera. Taka klasa jest nieodłącznym elementem wszystkich frameworków do PHP. Dlaczego tworzenie większej liczby jej obiektów nie ma sensu? Taki obiekt z reguły nie odbiera od nas danych, a jeśli już to robi, to w innym miejscu zwracane dane muszą być jednoznaczne.
Teraz zaprojektujemy bardzo uproszczoną wersję takiej klasy. Ponieważ poznaliśmy już interfejsy stworzymy interfejs zawierający następujące elementy:
- publiczną (public) metodę do pobierania kolejnych segmentów adresu
- publiczną metodę do ustawiania nowych wartości parametrów przekazanych w adresie
- prywatną (private) metodę __construct - zapobiegnie to samodzielnemu tworzeniu obiektów przy pomocy operatora new
- publiczną, statyczną metodę służącą do pobierania uchwytu obiektu
Na listingu nr 1 pokazany jest interfejs dla klasy Request, którą znajdziecie na listingu nr 2.
Klasa jak widać jest prosta i korzystanie z niej w bardziej zaawansowanych projektach z pewnością nie jest dobrym pomysłem. Doskonale ukazuje jednak praktyczne zastosowanie klas singleton.
Na listingu nr 3 pokazuję jej przykładowe użycie.
Inne przykłady zastosowania
Z innym zastosowaniem klas singleton spotkałem się jakiś czas temu podczas nauki zaawansowanych technik programowania w php. Była to klasa służąca do nawiązywania połączenia z bazą danych. Oczywiście był to także przykład, który nadawał się jedynie do prostych projektów, korzystających z jednej bazy.
Z singleton spotkałem się także w Spawn Frameworku, gdzie wzorzec singleton był zastosowany także w klasach do obsługi sesji itp.
Semi-singleton
Można oczywiście tworzyć także klasy oparte na wzorcu singleton, pozwalające jednak na tworzenie wielu obiektów. Takie rozwiązanie można wykorzystać, gdy tworzenie wielu obiektów jednej klasy ma rzeczywiście sens, ale do niektórych zastosowań wystarczy już istniejący obiekt.
Przykład takiej klasy przedstawiam na listingu nr 4.
Jak myślisz, nada się taki semi-singleton na klasę szablonów? Zwykle trzeba jeden do wyświetlenia, ale zdarza się że jeden szablon idzie do przeglądarki, a drugi poszedłby w mailu.
Jasne, chociaż nigdy się z takim rozwiązaniem nie spotkałem. Ani w Zend, Spawn, ani innym frameworku do PHP.