Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [getInstance] Co i jak?
Forum PHP.pl > Forum > PHP > Object-oriented programming
bim2
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ć?
Fipaj
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. ?>
thornag
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.
Prph
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.
bim2
@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
Prph
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.
thornag
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. ?>
Prph
moznaby tak zrobic smile.gif

a konstruktor prywatny dokladnie po to, jak mowisz.

Adrian.
bim2
No to teraz wrzucić to do artykułów i jak ktos się zapyta o to, to dac linka smile.gif Ładny artykuł winksmiley.jpg
Fipaj
Bim2, ******, do Wiki spojrzeć to nie łaska?

http://phpedia.pl/wiki/Singleton
bim2
Oo tongue.gif Nie zaglądąłem tam ostatnio smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.