Jak stworzyć klasę Singleton za pomocą klas PHP5?
php
oop
design-patterns
singleton
Andrew Moore
źródło
źródło
Odpowiedzi:
Używać:
$fact == $fact2;
Ale:
Zgłasza błąd.
Zobacz http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static, aby zrozumieć zakresy zmiennych statycznych i dlaczego ustawienie
static $inst = null;
działa.źródło
PHP 5.3 pozwala na tworzenie dziedzicznej klasy Singleton poprzez późne wiązanie statyczne:
To rozwiązuje problem polegający na tym, że przed PHP 5.3 każda klasa, która rozszerzyła Singleton, produkowałaby instancję swojej klasy nadrzędnej zamiast własnej.
Teraz możesz zrobić:
A $ foo będzie instancją Foobar zamiast instancji Singleton.
źródło
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
rezyduje w Singleton, a nie w podklasie. Po utworzeniu instancji jakiejś podklasy funkcja getInstance () zwróci tę instancję dla wszystkich podklas.Niestety odpowiedź Inwdr nie działa, gdy istnieje wiele podklas.
Oto poprawna dziedziczna klasa podstawowa Singleton.
Kod testowy:
źródło
Prawdziwy i nowoczesny sposób na stworzenie Singleton Pattern to:
Więc teraz możesz go używać jak.
Jak widzisz, ta realizacja jest znacznie bardziej elastyczna.
źródło
instance
funkcji$instance
powinien byćnull
niefalse
Prawdopodobnie powinieneś dodać prywatną metodę __clone (), aby uniemożliwić klonowanie instancji.
Jeśli nie podasz tej metody, możliwe staje się:
teraz
$inst1
! ==$inst2
- nie są już tym samym wystąpieniem.źródło
używać:
respose:
Jeśli używasz PHP 5.4: cecha jest opcją, więc nie musisz marnować hierarchii dziedziczenia, aby mieć wzorzec Singleton
a także zauważ, że niezależnie od tego, czy używasz cech, czy rozszerzasz klasę Singleton, jednym luźnym celem było utworzenie singletonu klas potomnych, jeśli nie dodasz następującego wiersza kodu:
w klasie dziecięcej
nieoczekiwany wynik to:
źródło
Ten kod może obowiązywać dla dowolnej klasy bez względu na jej nazwę.
źródło
Obsługuje wiele obiektów z 1 linią na klasę:
Ta metoda wymusi singletony w każdej klasie, którą chcesz, ale musisz dodać 1 metodę do klasy, w której chcesz stworzyć singleton, a to zrobi to za ciebie.
To również przechowuje obiekty w klasie „SingleTonBase”, dzięki czemu można debugować wszystkie obiekty, które były używane w systemie przez rekursywne
SingleTonBase
obiekty.Utwórz plik o nazwie SingletonBase.php i dołącz go do katalogu głównego skryptu!
Kod jest
Następnie dla każdej klasy, która ma być singletonem, po prostu dodaj tę małą pojedynczą metodę.
Oto mały przykład:
Możesz po prostu dodać tę funkcję singleton do dowolnej klasy, która utworzy tylko 1 instancję na klasę.
UWAGA: Zawsze powinieneś ustawić prywatność __construct, aby wyeliminować użycie nowej klasy (); instancje.
źródło
źródło
Tak naprawdę nie musisz używać wzorca Singleton, ponieważ uważa się go za antypattern. Zasadniczo istnieje wiele powodów, aby w ogóle nie wdrażać tego wzorca. Przeczytaj to na początek: Najlepsza praktyka na lekcjach singletona PHP .
Jeśli mimo wszystko nadal uważasz, że musisz użyć wzorca Singleton, moglibyśmy napisać klasę, która pozwoli nam uzyskać funkcjonalność Singleton poprzez rozszerzenie naszej abstrakcyjnej klasy SingletonClassVendor.
Po to przyszedłem, aby rozwiązać ten problem.
Użyj przykładu:
Aby udowodnić, że działa zgodnie z oczekiwaniami:
źródło
Cała ta złożoność („późne wiązanie statyczne” ... harumph) jest dla mnie po prostu oznaką zepsutego modelu obiektu / klasy PHP. Gdyby obiekty klasy były obiektami pierwszej klasy (patrz Python), wówczas „$ _instance” byłby zmienną instancji klasy - członkiem obiektu klasy, w przeciwieństwie do elementu / właściwości jego instancji, a także jako elementu współdzielonego przez jego potomków. W świecie Smalltalk jest to różnica między „zmienną klasy” a „zmienną instancji klasy”.
W PHP wydaje mi się, że musimy wziąć sobie do serca wskazówkę, że wzorce są przewodnikiem w pisaniu kodu - możemy być może pomyśleć o szablonie Singleton, ale próbować napisać kod, który odziedziczy z faktycznej klasy „Singleton” wygląda na mylnie dla PHP (choć przypuszczałem, że jakaś przedsiębiorcza dusza mogłaby stworzyć odpowiednie słowo kluczowe SVN).
Będę nadal kodować każdy singleton osobno, korzystając ze wspólnego szablonu.
Zauważ, że absolutnie trzymam się Z dala od dyskusji o singlach-złych, życie jest za krótkie.
źródło
Wiem, że prawdopodobnie spowoduje to niepotrzebną wojnę płomieni, ale widzę, jak możesz chcieć więcej niż jednego połączenia z bazą danych, więc zgodziłbym się z tym, że singleton może nie być najlepszym rozwiązaniem na to ... jednak istnieją inne zastosowania wzorca singletonu, które uważam za niezwykle przydatne.
Oto przykład: postanowiłem stworzyć własny silnik MVC i silnik szablonów, ponieważ chciałem czegoś naprawdę lekkiego. Jednak dane, które chcę wyświetlić, zawierają wiele specjalnych znaków matematycznych, takich jak ≥ i μ i co masz ... Dane są przechowywane jako rzeczywisty znak UTF-8 w mojej bazie danych, a nie kodowane wcześniej niż HTML, ponieważ moja aplikacja może dostarczać inne formaty, takie jak PDF i CSV oprócz HTML. Odpowiednie miejsce do formatowania HTML znajduje się w szablonie („widok”, jeśli chcesz), który jest odpowiedzialny za renderowanie tej sekcji strony (fragmentu). Chcę przekonwertować je na odpowiednie encje HTML, ale funkcja get_html_translation_table () PHP nie jest super szybka. Lepiej jest raz pobrać dane i zapisać je jako tablicę, dzięki czemu będą dostępne dla wszystkich. Tutaj' próbka, którą zapukałem, żeby przetestować prędkość. Przypuszczalnie działałoby to niezależnie od tego, czy inne metody, których używasz (po uzyskaniu instancji), są statyczne, czy nie.
Zasadniczo widziałem typowe wyniki:
Tak więc, chociaż z pewnością nie jestem ekspertem, nie widzę wygodniejszego i bardziej niezawodnego sposobu na ograniczenie narzutu powolnych wywołań pewnego rodzaju danych, jednocześnie czyniąc go bardzo prostym (jedna linia kodu, aby zrobić to, czego potrzebujesz). Przyznaję, że mój przykład ma tylko jedną przydatną metodę i dlatego nie jest lepszy niż funkcja zdefiniowana globalnie, ale jak tylko będziesz mieć dwie metody, będziesz chciał je zgrupować, prawda? Czy jestem daleko od bazy?
Wolę też przykłady, które faktycznie ZROBIJĄ, ponieważ czasami trudno jest wyobrazić sobie, kiedy przykład zawiera stwierdzenia takie jak „// zrób coś przydatnego tutaj”, które widzę cały czas podczas wyszukiwania samouczków.
Tak czy inaczej, chętnie przedstawię wszelkie uwagi lub komentarze na temat tego, dlaczego używanie singletonów do tego typu rzeczy jest szkodliwe (lub zbyt skomplikowane).
źródło
Ten artykuł obejmuje dość obszernie temat: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
źródło
Napisałem dawno temu, aby podzielić się tutaj
źródło
Zgadzam się z pierwszą odpowiedzią, ale chciałbym również zadeklarować klasę jako ostateczną, aby nie można było jej rozszerzyć, ponieważ przedłużenie singletonu narusza wzorzec singletonu. Również zmienna instancji powinna być prywatna, aby nie można było uzyskać do niej bezpośredniego dostępu. Ustaw także metodę __clone jako prywatną, aby nie można było sklonować obiektu singleton.
Poniżej znajduje się przykładowy kod.
Przykładowe użycie
Co powstrzymuje cię przed zrobieniem tego (co naruszałoby wzorzec singletonu ...
NIE MOŻESZ TEGO ZROBIĆ!
źródło
To powinna być właściwa droga Singletona.
źródło
Podobał mi się sposób użycia cech @ jose-segura, ale nie podobała mi się potrzeba definiowania zmiennej statycznej dla podklas. Poniżej znajduje się rozwiązanie, które pozwala tego uniknąć poprzez buforowanie instancji w statycznej zmiennej lokalnej do metody fabrycznej indeksowanej według nazwy klasy:
Użycie jest takie samo jak @ jose-segura, tylko brak potrzeby zmiennej statycznej w podklasach.
źródło
Klasa bazy danych, która sprawdza, czy istnieje instancja bazy danych, zwróci poprzednią instancję.
Zobacz http://www.phptechi.com/php-singleton-design-patterns-example.html
źródło
To jest przykład tworzenia singletona w klasie Database
wzory projektowe 1) singleton
to out put to -
użyj tylko jednej instancji, nie twórz 3 instancji
źródło
Szybki przykład:
Mam nadzieję, że pomoc.
źródło
Oto mój przykład, który zapewnia możliwość wywoływania jako $ var = new Singleton (), a także tworzenie 3 zmiennych w celu przetestowania, czy tworzy nowy obiekt:
źródło