Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Singleten(dobrze zrozuminy?
Forum PHP.pl > Forum > PHP
daniel1302
  1. <?php
  2. /**********************************************************************
  3. *Autor: daniel1302
  4. *Licencja: by DamnedLand Staff
  5. *Zadanie pliku:
  6. *Zainicjuje istnienie odpowiedniej klasy
  7. **********************************************************************/
  8.  
  9. Class Singleton
  10. {
  11. #Zdefiniuj otwieraną klasę
  12. protected $instance;
  13. #Wykaż wszystkie otwarte klasy
  14. public $openedClass = array();
  15. #Wymagana konfigracja
  16. private $conf = Kernel::config()->framework('framework');
  17.  
  18. /**
  19. *Zainicjuj klase z Frameworka
  20. *
  21. *@return object Wskazana klasa
  22. */
  23. public function instanceFramework($class)
  24. {
  25. $file = $this->conf['frameworkRoot'].'/'.$class.'.php';
  26. return $this->instance($file, $class);
  27. }
  28.  
  29. /**
  30. *Zainicjuj klase z gry
  31. *
  32. *@return object Wskazana klasa
  33. */
  34. public function instanceGame($class)
  35. {
  36. $file = $this->conf['gameRoot'].'/class/Class.'.$class.'.php';
  37. return $this->instance($file, $class);
  38. }
  39.  
  40. /**
  41. *Zapisz otwierane dane oraz zainicjuj klasę
  42. *
  43. *@return object Wskazana klasa
  44. */
  45. protected function instance($file, $class)
  46. {
  47. $this -> openedClass[]['file'] = $file;
  48. $this -> openedClass[]['class'] = $class;
  49. if (!file_exists($file))
  50. return false;
  51. else
  52. {
  53. $this -> instance = @new $class;
  54. if (class_exists($this->instance, false))
  55. {
  56. $this -> openedClass[]['status'] = false;
  57. return false;
  58. }
  59. else
  60. {
  61. $this -> openedClass[]['status'] = true;
  62. return $this -> instance;
  63. }
  64. }
  65. }
  66.  
  67. /**
  68. *Skasuj niepotrzebne
  69. *
  70. *@return null null
  71. */
  72. function __destruct()
  73. {
  74. unset($this->instance);
  75. unset($this->openedClass);
  76. unset($this->conf);
  77. }
  78. }
  79. ?>


Jest to klasa wzorca singleton(ja go tak rozumie czy dobrze?)
Jak go użyje:
do kontrolera dodam
$this -> load = new Singleton;


Jeszcze dla pewności.
Wzorzec singleton odpowiada za inicjacje pojedynczej klasy w pamięci?
Czyli ze jeśli chę otworzyć na chwilę klase to używam go tak?
ayeo
Nie! smile.gif Silngleton to klasa, której zostanie stworzona tylko jedna instancja. W sensie tylko jeden obiekt tej klasy. Ani jednego więcej, ani jednego mniej. Ma to sens gdy robimy np klasę do obsługi bazy danych. Jak wiadomo najwięcej czasu zabiera połączenie z bazą, więc nie ma sensu łączyć się wielkokrotnie. Łączenie z bazą to zadanie dla konstruktora, więc zostałby wywołany za każdym razem gdy tworzymy obiekt bazy danych. Daltego używa się (nie do końca;) ) Singletona. Jeżeli obiekt bazy został wcześniej stworzony (nawiązane zostało połączenie z bazą) to zostanie zwrócona już istniejąca instancja zamiast tworzenia nowej. Jest to realizowane poprze prywatny konstruktor. W sensie "new BD" zwróciłoby błąd - bo konstruktor jest prywatny i nie może być wywołany z zewnątrz. W samej klasie robisz statyczną metodę np getInstance(); która zwraca obiekt bazy jeżeli on istnieje (jest przypisany do statycznej zmiennej klasy) lub tworzy nowy i zwraca go....

Pozdrawiam!
daniel1302
Aha rozumie i np do czego to jest wykorzystywane(do innych rzeczy)?

Edit 8:38 by daniel1302
Po przeczytaniu tego artykułu wszystko mi się rozjaśniło
  1. <?php
  2.  
  3.  
  4. Class SingletonTest
  5. {
  6. #Blokujemy konstruktor aby ktoś nie zrobił kopi obiektu
  7. protected function __construct()
  8. {
  9. }
  10. #Singleton
  11. public function getInstance()
  12. {
  13. #Określ statyczną trwałą
  14. static $instance;
  15. if (!isset($instance))
  16. {
  17. #Bez referencjo bo w php5 są automatyczne
  18. $instance = new SingletonTest;
  19. }
  20. return $instance;
  21. }
  22. #Normalna funkcja
  23. public function getText()
  24. {
  25. return 'by daniel1302';
  26. }
  27. }
  28. $sT = SingletonTest::getInstance();
  29. var_dump($sT->getText());
  30. ?>

Ciekawe coraz ciekawsze to PHP jest rok temu zaczynałem to tylko dla rozrywki a teraz jeśli nie piszę tydzień to mnie rozbraja Hehehe
ayeo
Metodę getInstance() wywołujesz jak statyczną (i bardzo dobrze) jednak w kodzie masz ją zaimplementowaną jako niestatyczną smile.gif

Pewnie przeoczenie, ale tak piszę na wszelki wypadek.

Pozdrawiam!
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.