![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 48 Pomógł: 0 Dołączył: 3.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cześć. Kiedyś programując w C++ nauczyłem się pisać ciekawy wzorzec, który nazywał się automatycznym singletonem. Swoją "automatyczność" zawdzięcza temu, że można po nim odziedziczyć podając jako parametr szablonu nazwę klasy pochodnej (dziedziczącej). IMHO takie rozwiązanie jest o wiele wygodniejsze. Pomyślałem, że można coś takiego napisać w PHP:
Co o tym sądzicie? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 800 Pomógł: 0 Dołączył: 26.11.2005 Skąd: Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Po co dawać setType przecie zasadniczo, to działa bez naszej pomocy. Wystarczy dać self.
Według mnie to powinno być tak:
Nie testowałem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ale potem robisz tylko:
|
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@Koleś Tutaj czegos takiego nie masz. Singleton to singleton, przyklad masz w manualu bo co na sile kombinowac.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 48 Pomógł: 0 Dołączył: 3.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Wystarczy dać self. Aha, dzięki, nie wiedział, że to jest możliwe (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) @Koleś Tutaj czegos takiego nie masz. Singleton to singleton, przyklad masz w manualu bo co na sile kombinowac. Po to, żeby nie trzeba było pisać tego samego kodu w kilku klasach. |
|
|
![]()
Post
#5
|
|
Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
@Turgon, mala przyczepka (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Linia 8 Twojego kodu mogłaby wyglądać tak:
Kiedyś byłem bliski przypadkowi, że zamieniam statyczną $instance i się dziwiłem dlaczego mam errora, a instancja jest w środku... po prostu to nie była instancja (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 800 Pomógł: 0 Dołączył: 26.11.2005 Skąd: Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Wolnoć Tomku w swoim domku !
Dla mnie nie ma większej różnicy powiem szczerze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Co do singletonu jako wzorca mam kilka zastrzeżeń.
Dziedziczenie singletonów w PHP nie działa, ponieważ odwołanie do self w metodzie zawsze tyczy się klasy, w której ta metoda została zaimplementowana. Przykład:
W ogóle ten temat to pomyłka, i to dość spora, ktoś pisze o implementacji singletonu w PHP... |
|
|
![]()
Post
#8
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Brak uniemożliwienia klonowania obiektu.
Czemu klasa nie jest abstrakcyjna? Nie był by potrzebny ten Exception(). Swoją drogą lepiej już napisać obiekt rejestru/fabryki w którym była by przechowywana i tworzona jedna instancja danej klasy. |
|
|
![]()
Post
#9
|
|
Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
@splatch, o widzę przykład z mojego bloga (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
http://athlan.vgroup.pl/singleton-registry-map/ Cytat Dziedziczenie singletonów w PHP nie działa, ponieważ odwołanie do self w metodzie zawsze tyczy się klasy, w której ta metoda została zaimplementowana. Mój przykład wyświetla coś innego, sprzecznego z Twoją wypowiedzią: Kod Hello World! ID: 90593c18e926b6f8cc33b261b02201a7
Hello World! ID: 90593c18e926b6f8cc33b261b02201a7 Hello World! ID: 90593c18e926b6f8cc33b261b02201a7 Hello World! ID: 90593c18e926b6f8cc33b261b02201a7 HelloWorld HelloWorld Ten post edytował Athlan 9.03.2007, 23:39:27 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 800 Pomógł: 0 Dołączył: 26.11.2005 Skąd: Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Athlan: Tak bez obrazy, ale twój przykład potwierdza kolega o nie dziedziczeniu. Ja tylko klasę przerobiłem na PHP i nie testowałem w ogóle...
|
|
|
![]()
Post
#11
|
|
Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Athlan: Tak bez obrazy, ale twój przykład potwierdza kolega o nie dziedziczeniu. Ja tylko klasę przerobiłem na PHP i nie testowałem w ogóle... Jak to o NIE dziedziczeniu? Skoro rodzic "wykonuje" instację samego siebie, a dziecko które próbuje wykonać instancję i posiada instancję taką, jaką postada rodzic to singleton jest dziedziczony (przekazywany dziecku). (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował Athlan 10.03.2007, 19:16:09 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jak to o NIE dziedziczeniu? Skoro rodzic "wykonuje" instację samego siebie, a dziecko które próbuje wykonać instancję i posiada instancję taką, jaką postada rodzic to singleton jest dziedziczony (przekazywany dziecku). (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie. self jest zależny od kontekstu metody. Jeśli metoda Instance() jest zadeklarowana w klasie HelloWorld to odnosi się do HelloWorld. Jeżeli zatem odwołujesz się do HelloWorldChildren::Instance nie nadpisując tej metody to kontekst się nie zmienia i jest to wciąż HelloWorld. W Javie odwołania statyczne np są zawsze zależne od klasy z której wywołanie następuje, czyli w HelloWorld.Instance() zwróci instancję HelloWorld i logicznie HelloWorldChildren.Instance() zwróci instancję HelloWorldChildren. Zwróć uwagę, że $this zachowuje się inaczej i nie jest zależne od metody a od klasy. To jest po prostu bug w PHP. W metodzie statycznej nie jesteś w stanie pobrać nazwy klasy, z której została ona wywołana. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
zgadzam sie w 100% Po co przytakujesz wypowiedzi sprzed 4 miesięcy? A co do automatycznego singletona -> można to zrobić w prosty sposób za pomocą programowania aspektowego. Przykład takiego użycia umieściłem na blogu, gdyż zajęłoby to zbyt dużo miejsca na forum. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Cytat Po co przytakujesz wypowiedzi sprzed 4 miesięcy? Mowisz sam do siebie ? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) Mowiac prawde UDAT ten twoj pomysl jest niewiele wart bo malo ktory admin poinstaluje ci rozszerzenia PECL ktore chcesz. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
To rozszerzenie wymagane jest tylko podczas łączenia aspektów z kodem klas. Do uruchomienia samych klas nie jest potrzebne - tak więc możesz używać powstałego kodu na dowolnym hostingu.
Mowisz sam do siebie ? snitch.gif Kto usunął tego posta? (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) Ten post edytował UDAT 29.06.2007, 12:14:10 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 00:21 |