Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Jak używać Singleton w klasach
Matado
post
Post #1





Grupa: Zarejestrowani
Postów: 67
Pomógł: 0
Dołączył: 9.12.2008

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


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. ?>


Ten post edytował Matado 29.04.2009, 13:42:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
osl
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 41
Dołączył: 6.04.2009
Skąd: Gdańsk/okolice

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


ż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?
Go to the top of the page
+Quote Post
Matado
post
Post #3





Grupa: Zarejestrowani
Postów: 67
Pomógł: 0
Dołączył: 9.12.2008

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


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.
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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()

Ten post edytował sowiq 29.04.2009, 14:10:34
Go to the top of the page
+Quote Post
taktu
post
Post #5





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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. ?>
Go to the top of the page
+Quote Post
wookieb
post
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 18.05.2009, 21:26:44


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jeszcze zostaje rejestr, kupa innych wzorców...

Nie ma sensu rozpoczynać kolejnego flamewaru, był już co najmniej jeden. tongue.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
taktu
post
Post #9





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


przypomnę że pytałem o to jak używać Singletona a nie czy smile.gif


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@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
Go to the top of the page
+Quote Post
marcio
post
Post #11





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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
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 Aktualny czas: 20.08.2025 - 21:55