Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Singleten(dobrze zrozuminy?
daniel1302
post 12.08.2008, 21:27:02
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


  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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
ayeo
post 12.08.2008, 21:37:19
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


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!


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 13.08.2008, 06:16:29
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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

Ten post edytował daniel1302 13.08.2008, 07:46:52
Go to the top of the page
+Quote Post
ayeo
post 13.08.2008, 11:31:41
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


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!


--------------------
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:36