Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [getInstance] Co i jak?, .. z czym to się je
bim2
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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
 
Start new topic
Odpowiedzi (1 - 10)
Fipaj
post
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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Oto magiczny Singleton, który rozwiązuje twoje problemy (IMG:http://forum.php.pl/style_emoticons/default/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
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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
Prph
post
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
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. (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Prph
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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
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. ?>
Go to the top of the page
+Quote Post
Prph
post
Post #8





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

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


moznaby tak zrobic (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

a konstruktor prywatny dokladnie po to, jak mowisz.

Adrian.
Go to the top of the page
+Quote Post
bim2
post
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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ładny artykuł (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Fipaj
post
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
Post #11





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

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


Oo (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Nie zaglądąłem tam ostatnio (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 14:27