![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
No cóż. Staram się napisać uniwersalny kod (dla php4 i php5), oczywiście piszę obiektowo i chciałbym użyć singletonów. I w związku z tym moje pytanie: Jak rozwiązujecie problem singletonów w php 4?
Pytanie zadaję w osobnym topicu, ponieważ w wielu tematach jest to poruszane, ale nie rozwiązywane. Myślę, że jeśli zgromadzimy tutaj wszystkie kody/odpowiedzi, to może ktoś stworzy naprawdę dobry kod kontrolujący liczbę instancji w aplikacji ![]() Czekam na rozwiązania... -------------------- Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
Generalnie to piszę póki co sturkturalnie, ale gdybym w 4 miał zrobić singletona, to wykorzystałbym w tym celu zmieną globalną, a w klasie kontrolował jej wartość. W konstruktorze naturalnie inkrementowałbym zmienną i nie pozwolił tworzyć obiektu, jeśli ma ona wartość 1 (początkowa naturalnie 0). To tak czysto teoretycznie, bo nie sprawdzałem...
-------------------- ![]() "Nie wiedziałem tylko, że Bóg też był na grzybach, gdy majstrował przy wszechświecie" (Janusz Wisniewski) dev: gazeta.ie |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 554 Pomógł: 0 Dołączył: 4.04.2002 Skąd: Tychy Ostrzeżenie: (0%) ![]() ![]() |
Najlatwiej jest uzyc zmiennej statycznej:
-------------------- "Real children don't go hoppity-skip unless they are on drugs."
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
rzseattle: prawdę mówiąc to ten kod (mnie przynajmniej) w php4 nie działa mimo że wywołuję metodę singleton poprzez
-------------------- Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
W JAVA zrobiłbym to tak:
class Test{ private Test(){} public static Test makeTest(){ return new Test(); } private static Test t1 = new Test(); public static Test access(){ return t1; } } A później już tylko: Test myTest = Test.makeTest(); -------------------- ![]() "Nie wiedziałem tylko, że Bóg też był na grzybach, gdy majstrował przy wszechświecie" (Janusz Wisniewski) dev: gazeta.ie |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Podczas moich prob dojscia do tego jak sie je stosuje w php4 (bylo kilka problemow z referencjami) powstal taki oto testowy kod:
Mysle, ze to wszystko wyjasnia... -------------------- Brak czasu :/
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
A ja myślę, że to nie jest taki całkiem singleton, bo w tym wzorcu konstruktor MUSI być prywatny, bo jak inaczej chesz wymusić na programiście-kliencie używanie jakiejś metody do towrzenia instancji klasy? A tak robisz prywatny konstruktor i klasa sama w sobie tworzy obiekt i zwraca referencję do niego.
-------------------- ![]() "Nie wiedziałem tylko, że Bóg też był na grzybach, gdy majstrował przy wszechświecie" (Janusz Wisniewski) dev: gazeta.ie |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Cytat A ja myślę, że to nie jest taki całkiem singleton, bo w tym wzorcu konstruktor MUSI być prywatny
Uhm, w PHP4 raczej nie ma prywatnych konstruktorów, więc to wszystko jest takie umowne, nie? |
|
|
![]()
Post
#9
|
|
![]() Grupa: Przyjaciele php.pl Postów: 554 Pomógł: 0 Dołączył: 4.04.2002 Skąd: Tychy Ostrzeżenie: (0%) ![]() ![]() |
Cytat rzseattle: prawdę mówiąc to ten kod (mnie przynajmniej) w php4 nie działa mimo że wywołuję metodę singleton poprzez
[php:1:a773d9567a]<?php klasa::singleton(); ?>[/php:1:a773d9567a] 8O Hmm ciekawe. U mnie caly silnik opiera sie wlasnie na takich singletonach i dziala bez zarzutu. Pozatym rozwiazanie FiDO jest identyczne. Jesli u ciebie nie dzialalo to nie mam pojecia dlaczego. -------------------- "Real children don't go hoppity-skip unless they are on drugs."
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%) ![]() ![]() |
Cytat Uhm, w PHP4 raczej nie ma prywatnych konstruktorów, więc to wszystko jest takie umowne, nie?
No fakt. Ale w 5 już są ![]() ![]() -------------------- ![]() "Nie wiedziałem tylko, że Bóg też był na grzybach, gdy majstrował przy wszechświecie" (Janusz Wisniewski) dev: gazeta.ie |
|
|
![]()
Post
#11
|
|
![]() Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
hmm haflik nie wiem czy do konca przeczytales temat: Singletony w php4
W sumie w rozwiazaniu FiDO nie podoba mi sie to, ze instancja jest przechowywana w metodzie, ale moze to jedyne rozwiazanie... No coz, ja w tej chwili mam duzo pracy w dev, ale caly czas bawie sie singletonami, bo chce ich uzywac, ale rownoczesnie chce, zeby moj kod dzialal i w PHP4 i w PHP5 -------------------- Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN |
|
|
![]()
Post
#12
|
|
![]() Administrator planeta/IRC Grupa: Przyjaciele php.pl Postów: 385 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Zabrze Ostrzeżenie: (0%) ![]() ![]() |
Hmm... od 3 tygodni mam gotowy zarys artykułu o Singletonach w 4, i jakos nie moge sie zebrać zeby do XML'a wsadzić... A widze że mogłoby sie przydać. Oczywiście w arcie opisana jest metoda przedstawiona przez FiDO, opisane tez jest dlaczego nie warto stosować zmiennych globalnych, i dlaczego instancje powinna zwracać metoda danej klasy, a nie jakaś funkcja z zewnątrz. Będe musiał postarać sie dokończyć tego arta
![]() -------------------- "Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning."
Cudi's devBlog |
|
|
![]()
Post
#13
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Cytat A ja myślę, że to nie jest taki całkiem singleton, bo w tym wzorcu konstruktor MUSI być prywatny, bo jak inaczej chesz wymusić na programiście-kliencie używanie jakiejś metody do towrzenia instancji klasy? A tak robisz prywatny konstruktor i klasa sama w sobie tworzy obiekt i zwraca referencję do niego.
Tak jak mowisz, tyle ze w jak napisal juz hawk w php4 nie da sie tak zrobic bo nie ma modyfikatorow dostepu. Ten kod jest wynikiem metamorfozy tego: Kod #include <iostream>
using namespace std; class Singleton { static Singleton *instance; Singleton() : cos(0) { cout << "Singleton::Singleton()n"; } public: int cos; static Singleton* GetInstance() { if (Singleton::instance == NULL) { Singleton::instance = new Singleton; } return Singleton::instance; } }; Singleton* Singleton::instance = NULL; int main() { Singleton *a, *b, *c; a = Singleton::GetInstance(); b = Singleton::GetInstance(); c = Singleton::GetInstance(); cout << a->cos << ", " << b->cos << ", " << c->cos << endl; a->cos++; cout << a->cos << ", " << b->cos << ", " << c->cos << endl; b->cos++; cout << a->cos << ", " << b->cos << ", " << c->cos << endl; return 0; } Jest to kod, ktory "stworzylem" przed tym w php, zeby sie upewnic, ze da sie zrobic "idealny" singleton (obiekt tworzony tylko i wylacznie za pomoca statycznej metody), kod jest w Cpp i staralem sie maxymalnie go odzwierciedlic, ale jak widac malo z tego co mozna w Cpp da sie w php4, stad ta umowna prywatnosc konstruktora. Cytat W sumie w rozwiazaniu FiDO nie podoba mi sie to, ze instancja jest przechowywana w metodzie, ale moze to jedyne rozwiazanie...
Niestety chyba jedyna, tez wolalbym zeby to wygladalo tak jak w przykladzie wyzej, ale w php4 nie ma statycznych pol w klasach, wiec mozna tylko tak. -------------------- Brak czasu :/
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.06.2025 - 07:57 |