Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [getInstance] Co i jak?, .. z czym to się je
bim2
post 25.08.2006, 19:36:58
Post #1





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Nie wiem czemu ale nie działa mi coś ala getInstance smile.gif Czyli zwracanie $this POwiem tylko że skopjowałem to skaś i nie wiem jak to ma być, dlatego oczekuje gotowy skrypt (tzn. funkcję)
Moja klasa:
  1. <?php
  2. class Controler {
  3. [...]
  4. function &getInstance()
  5. {
  6.  
  7. return $this;
  8. }
  9. [...]
  10. }
  11. ?>
I póxnije mam inna klasę:
  1. <?php
  2. class IndexMod {
  3. [...]
  4. function news()
  5. {
  6. print_r(Controler::getInstance());
  7. [...]
  8. }
  9. [...]
  10. }
  11. ?>

Lecz to zwraca mi obiekty klasy IndexMod Jak to ma być?


--------------------
Go to the top of the page
+Quote Post
Fipaj
post 25.08.2006, 19:42:41
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 19.01.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Controller przez dwa L tongue.gif

Oto magiczny Singleton, który rozwiązuje twoje problemy tongue.gif

  1. <?php
  2. class Single {
  3.  
  4. static protected $_singleInstance = null;
  5.  
  6. static public function init () {
  7. if (is_null (self::$_singleInstance)) {
  8. self::$_singleInstance = new Single;
  9. }
  10. return self::$_singleInstance;
  11. }
  12.  
  13. }
  14. ?>


--------------------
Go to the top of the page
+Quote Post
thornag
post 27.08.2006, 09:51:31
Post #3





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Ja jeszcze tylko dodam, ze gdybys nie kopiowal bezmyslnie mojego nieudanego prsudokodu to by nie bylo problemu smile.gif Nie opieraj sie na tym co napisalem w watku o implementacji. To jest po prostu w piec minut napisane bez zadnycnh przemyslen ani nic.


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
Prph
post 27.08.2006, 15:16:33
Post #4





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Cytat(Fipaj @ 25.08.2006, 18:42 ) *
  1. <?php
  2. static protected $_singleInstance = null;
  3. ?>


Witam,

Dlaczego protected? Warto w ogole jest dziedziczyc z klasy Singletone?
Na dobra sprawe to tylko jedna metoda:

  1. <?php
  2. public static function getInstance()
  3. {
  4. if(!self::$_oInstance instanceof self)
  5. self::$_oInstance = new self;
  6.  
  7. return $_oInstance;
  8. }
  9. ?>


A co jezeli trzeba bedzie podac parametry dla konstruktora? Dziedziczenie okaze sie zupelnie zbedne.

Adrian.
Go to the top of the page
+Quote Post
bim2
post 27.08.2006, 15:22:40
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


@thornag: Skopjowałem tlyko tne kawałek kodu, poniewaz nie wiedziałem jak zrobić zwracanie $this, bo nigdy nie robiłem. biggrin.gif Skopjowałem twój kod na poczatku, ale póxniej napisałem własny. Ale dzięx za nakierowanie mnie woóle.
Co do tematu. Z singeltonem sobie poradziłem, i działa ładnie. Jeszcze doczytałem że nie można przekazywac parametrów do getInstance dlatego dałem np. w mysql $db->connect ;P Trzeba by napisac coś o singeltionie w artykułach bo mało osób to rozumie smile.gif


--------------------
Go to the top of the page
+Quote Post
Prph
post 27.08.2006, 17:49:11
Post #6





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Artykulu nie che mi sie pisac winksmiley.jpg

Krotko i tresciwie o Singletone

Singletone to wzorzec projektowy (wzorzec to gotowe rozwiazanie na czeste problemy). Singletone tworzy sie, aby:

1. W calej aplikacji miec dostep do danego obiektu
2. Wykluczyc mozliwosc utworzenia wiecej niz jednego obiektu danej klasy.

Przyklady:

Ad 1. Np. obiekt bazy danych MySQL - nie bedziemy przeciez 10 razy robic $baza = new BazaMySQL('host', 'login', 'haslo', 'baza_danych');

Ad 2. Ciezko mi podac jakis przyklad dla poczatkujacych, ale ta sama baza danych jest dobrym przykladem. Wtedy wykluczymy, ze gdzies dwa razy laczymy sie z ta sama baza danych (przy duzych projektach jest to mozliwe, jezeli nad kodem pracuje kilku programistow).

Zalozenia Singletone:
1. konstruktor klasy musi byc prywatny
2. musi istniec statyczna metoda (funkcja klasy), ktora zwroci nam obiekt danej klasy.

KOD

  1. <?php
  2. class MojaKlasaSingletone
  3. {
  4. private static $instance;
  5.  
  6. private function __construct()
  7. {
  8. }
  9.  
  10. public static function getInstance()
  11. {
  12. }
  13. }
  14. ?>


Zarys klasy mamy juz gotowy. Zmienna prywatna $instance bedzie zawierala obiekt klasy. przez getInstance() bedzie mozliwe otrzymanie tego obiektu. A wiec uzupelniamy kod:

  1. <?php
  2. public static function getInstance()
  3. {
  4. if(!self::$instance instanceof self)
  5. {
  6. self::$instance = new self;
  7. }
  8.  
  9. return self::$instance;
  10. }
  11. ?>


Self jest slowem php i oznacza obecna klase. To tak jak $this, tylko ze, self zawiera nazwe klasy, a ponadto self uzywa sie do odwolania do statycznych zmiennych.
instanceof jest operatorem. Zwraca true albo false jezeli dany obiekt jest instancja jakiejs klasy.

Podsumowujac, sprawdzamy, czy nasza zmienna $instance jest obiektem naszej klasy. Z faktu, ze tworzone zmienne sa wartosci null, warunek ten zwraca false przy pierwszym wywolaniu funkji getInstance. Pozniej obiekt jest juz utworzony.

No to mamy gotowego singletone!

Teraz pokaze, jak uzywac singletone, kiedy konstruktor wymaga parametrow.

  1. <?php
  2. class MojaKlasaSingletone
  3. {
  4. private static $instance;
  5.  
  6. private function __construct($imie)
  7. {
  8. }
  9.  
  10. public static function init($imie)
  11. {
  12. if(!self::$instance instanceof self)
  13. {
  14. self::$instance = new MojaKlasaSingletone($imie);
  15. }
  16.  
  17. return self::$instance; 
  18. }
  19.  
  20. public static function getInstance()
  21. {
  22. if(!self::$instance instanceof self)
  23. {
  24. echo 'Musisz najpierw uzyc init()!';
  25. return false;
  26. }
  27.  
  28. return self::$instance; 
  29. }
  30. }
  31. ?>


Jak widac, zadanie utworzenia obiektu przejela metoda init.

Prosze zwrocic uwage, ze w init() tworzymy obiekt tak: self::$instance = new MojaKlasaSingletone($imie);
Jezeli konstruktor nie wymaga parametrow, mozemy napisac new self;. W innym przypadku nazwa klasy jesy potrzebna.

Jak uzywac Singletone? Przyklad zwykly i z parametrami:
  1. <?php
  2. $obekt = MojaKlasaSingletone::getInstance();
  3. // w tej chwili mozeby juz uzywac obiektu.
  4.  
  5. $obiekt = MojaKlasaSingletone::init('Adrian');
  6. // to dotyczy singletone z parametrami dla konstruktora.
  7. // W dalszej czesci aplikacji wystarczy ze zrobimy:
  8.  
  9. $obekt = MojaKlasaSingletone::getInstance();
  10. // aby ponownie uzyc klasy.
  11. ?>



Mam nadzieje, ze pomoglem. UWAGA: nie sprawdzalem kodu. Oprocz literowek, kod powinien dzialac.

Adrian.
Go to the top of the page
+Quote Post
thornag
post 28.08.2006, 09:48:54
Post #7





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

Ostrzeżenie: (0%)
-----


Konstruktor musi byc prywatny zeby wylkuczyc $zmienna = New Obiekt(), czy tak ?

I nie mozna by bylo zrobic tak ?

  1. <?php
  2. static public function getInstance($param) {
  3. if( is_null( self::$WebRequest ) ) {
  4. return self::$WebRequest = new WebRequest($param);
  5. }
  6. return self::$WebRequest;
  7. ?>


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
Prph
post 28.08.2006, 10:07:32
Post #8





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


moznaby tak zrobic smile.gif

a konstruktor prywatny dokladnie po to, jak mowisz.

Adrian.
Go to the top of the page
+Quote Post
bim2
post 28.08.2006, 11:14:47
Post #9





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


No to teraz wrzucić to do artykułów i jak ktos się zapyta o to, to dac linka smile.gif Ładny artykuł winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
Fipaj
post 28.08.2006, 11:17:43
Post #10





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 19.01.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Bim2, ******, do Wiki spojrzeć to nie łaska?

http://phpedia.pl/wiki/Singleton


--------------------
Go to the top of the page
+Quote Post
bim2
post 28.08.2006, 12:52:57
Post #11





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Oo tongue.gif Nie zaglądąłem tam ostatnio smile.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:51