Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak używać Singleton w klasach
Forum PHP.pl > Forum > Przedszkole
Matado
Chciałbym wykorzystać Singleton w moim systemie newsowym. Wziąłem tą implementacje z phpedia.pl, ale mam problem. Jak użyć Singleton żeby można było go wykorzystywać w moich klasach?
Czy trzeba dołączyć plik z klasą Singleton do mojej klasy przez include() czy co, tylko jak później tego użyć np. z łączeniem się przez PDO?
Jak w ogóle go użyć do łączenia się z bazą danych przy kilku klasach?

Implementacja z phpedia.pl
  1. <?php
  2.  
  3. final class Singleton
  4. {
  5.    /**
  6.      * Przechowuje instancję klasy Singleton
  7.      *
  8.      * @var object
  9.      * @access private
  10.      */
  11.    private static $oInstance = false;
  12.  
  13.    /**
  14.      * Zwraca instancję obiektu Singleton
  15.      *
  16.      * @return Singleton
  17.      * @access public
  18.      * @static
  19.      */
  20.    public static function getInstance()
  21.    {
  22.        if( self::$oInstance == false )
  23.        {
  24.            self::$oInstance = new Singleton();
  25.        }
  26.        return self::$oInstance;
  27.    }
  28.  
  29.    private function __construct() {}
  30. }
  31. ?>


Przykładowa klasa
  1. <?php
  2.  
  3. class news
  4. {
  5.    public function __construct()
  6.    {
  7.        
  8.    }
  9.    
  10.    public function somemethod()
  11.    {
  12.  
  13.    }
  14. }
  15.  
  16. ?>
osl
żeby używać Singletona trzeba go zrozumieć od początku do końca, nie ma sensu używać go na siłę "bo mówią że to fajne".
klasę dołączasz jak każdą inną klasę, tu ważne jest jej zachowanie.

co dokładnie chcesz osiągnąć z tymi bazami?
Matado
Mam np. parę klas i nie chcę łączyć się co chwilę przy każdej klasie z bazą. Dlatego chciałbym użyć Singleton, żeby nie było potrzeby łączenia się z bazą w każdej klasie.
sowiq
Użycie jest banalnie proste. Zamiast robić
  1. <?php
  2. $s = new Singleton();
  3. ?>
robisz
  1. <?php
  2. $s = Singleton::getInstance();
  3. ?>
Resztę masz zaimplementowaną w przykładzie, który podałeś.
Dla celów edykacyjnych możesz dopisać w konstruktorze klasy Singleton
  1. <?php
  2. echo 'Tworzę nowy obiekt';
  3. ?>
i zobaczyć ile razy wydrukuje się ten tekst jeśli kilkukrotnie wywołasz Singleton::getInstance()
taktu
To jeszcze jedno pytanie z mojej strony, który zapis jest lepszy / prawidłowy / bezpieczniejszy?

  1. <?php
  2. class baker {
  3.  
  4.        public function getCookie( $var ){
  5.  
  6.            $db = db::instance();
  7.  
  8.            $sql = 'SELECT * FROM cookie';
  9.            
  10.            $db->query( $sql );
  11.  
  12.            ...
  13.  
  14.        }
  15. }
  16. ?>


czy może przekazywać obiekt bazy przy wywołaniu metody

  1. <?php
  2. class baker {
  3.  
  4.        public function getCookie( db $db,  $var ){
  5.  
  6.            $sql = 'SELECT * FROM cookie';
  7.            
  8.            $db->query( $sql );
  9.  
  10.            ...
  11.  
  12.        }
  13. }
  14. ?>
Crozin
Korzystanie z singletona w klasie obsługującej bazę danych to imo jedna z najgłupszych rzeczy. A co jak będziesz chciał używać dwóch połączeń do dwóch różnych baz? Lepiej jest przekazać obiekt poprzez parametr w konstruktorze innego obiektu:
  1. <?php
  2.  
  3. $db = new DB();
  4. $abc = new Abc($db);
  5.  
  6. class Abc{
  7.  private $db;
  8.  
  9.  public function __construct(DB $db){
  10.    $this->db = $db;
  11.  }
  12. }
  13. ?>
wookieb
Cytat(Crozin @ 18.05.2009, 22:16:17 ) *
Korzystanie z singletona w klasie obsługującej bazę danych to imo jedna z najgłupszych rzeczy. A co jak będziesz chciał używać dwóch połączeń do dwóch różnych baz?


Dopisujesz metode ktora przelacza na druga baza i w razie potrzeby można wrócić do pierwszej. Ale tak naprawde wyjatkowo rzadko trzeba się łączyć z innymi bazami. Wiec singleton do bazy danych jest idealny.

Cytat(Crozin @ 18.05.2009, 22:16:17 ) *
Lepiej jest przekazać obiekt poprzez parametr w konstruktorze innego obiektu:


Wiec bawi cię przekazywanie referencji do obiektu do każdej klasy? Sorry, ale wlasnie dlatego wybieram singletona zeby nie mieć takich krzaczków.
A jak nagle mi sie zachce w pewnej klasie uzywac bazy danych to nie czeka mnie bezsensowne dopisywanie argumentów do konstruktora.

Zapewne może jeszcze paść argument o global ale jak wszyscy wiemy, global to zło.
erix
Jeszcze zostaje rejestr, kupa innych wzorców...

Nie ma sensu rozpoczynać kolejnego flamewaru, był już co najmniej jeden. tongue.gif
taktu
przypomnę że pytałem o to jak używać Singletona a nie czy smile.gif
Crozin
@wookieb: mi nie chodziło o baze danych w obrębie bazy danych
  1. USE someDatabase;
Tylko o zupełnie inny serwer bazy danych - wymagający osobnego połączenia.

@taktu: Nie... Ty pytałeś w tym poście: http://forum.php.pl/index.php?s=&showt...st&p=609331 o to czy uzyskać dostęp do obiektu poprzez singleton czy przekazując go jako parametr. biggrin.gif
marcio
Cytat
Korzystanie z singletona w klasie obsługującej bazę danych to imo jedna z najgłupszych rzeczy. A co jak będziesz chciał używać dwóch połączeń do dwóch różnych baz?

Wtedy stosujesz PROPERTY lub Registry i cieszysz sie 2 bazami.
Crozin
Yyy.. wzorzec singleton gwarantuje mi to, że zostanie utworzona tylko jedna instancja danej klasy (to że będzie dostepna globalnie to inna bajka), tak więc na nic mi się to zda. winksmiley.jpg
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.