Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Automatyczny singleton.
Koleś
post
Post #1





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 3.03.2007

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


Cześć. Kiedyś programując w C++ nauczyłem się pisać ciekawy wzorzec, który nazywał się automatycznym singletonem. Swoją "automatyczność" zawdzięcza temu, że można po nim odziedziczyć podając jako parametr szablonu nazwę klasy pochodnej (dziedziczącej). IMHO takie rozwiązanie jest o wiele wygodniejsze. Pomyślałem, że można coś takiego napisać w PHP:

  1. <?php
  2. class Singleton
  3. {
  4. protected static $type = false;
  5.  
  6. protected function __construct() {}
  7. public function SetType( $type_ )
  8. {
  9. self::$type = $type_;
  10. }
  11.  public static function Instance()
  12.  {
  13. static $instance;
  14. if( ! self::$type )
  15. {
  16. throw new Exception( 'Po Singletonie należy odziedziczyć' );
  17. }
  18. if( ! isset( $instance ) ) $instance = new self::$type;
  19. return $instance;
  20.  }
  21. }
  22. ?>


  1. <?php
  2. class Test extends Singleton
  3. {
  4. public function Show() { echo 'abcd <br />'; }
  5. }
  6. ?>


  1. <?php
  2. Test::SetType( 'Test' );
  3. Test::Instance()->Show();
  4. ?>


Co o tym sądzicie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
splatch
post
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Co do singletonu jako wzorca mam kilka zastrzeżeń.

Dziedziczenie singletonów w PHP nie działa, ponieważ odwołanie do self w metodzie zawsze tyczy się klasy, w której ta metoda została zaimplementowana. Przykład:
  1. <?php
  2.  
  3. class HelloWorld {
  4.  
  5. protected static $_oInstance = null;
  6. protected $_sUniqueIdentyficator = null;
  7.  
  8. protected function __construct() {
  9. $this->_sUniqueIdentyficator = md5( sha1( time() * rand(1, 999) ) );
  10. }
  11.  
  12. public static function Instance() {
  13. if(!self::$_oInstance instanceof self)
  14. self::$_oInstance = new self;
  15. return self::$_oInstance;
  16. }
  17.  
  18. public function SayHello() {
  19. echo 'Hello World! ID: ' . $this->_sUniqueIdentyficator ."n";
  20. }
  21. }
  22. class HelloWorldChildren extends HelloWorld {
  23.  
  24. public function SayHello() {
  25. echo 'Childern says hello World! ID: ' . $this->_sUniqueIdentyficator ."n";
  26. }
  27. }
  28. $oHello1 = HelloWorld::Instance();
  29. $oHello1->SayHello();
  30.  
  31. $oHello2 = HelloWorld::Instance();
  32. $oHello2->SayHello();
  33.  
  34. $oHello3 = HelloWorldChildren::Instance();
  35. $oHello3->SayHello();
  36.  
  37. $oHello4 = HelloWorldChildren::Instance();
  38. $oHello4->SayHello();
  39.  
  40. echo get_class($oHello1) ."n";
  41. echo get_class($oHello3);
  42.  
  43. ?>


W ogóle ten temat to pomyłka, i to dość spora, ktoś pisze o implementacji singletonu w PHP...
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 10:03