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
Athlan
post
Post #2





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Cytat
Athlan: Tak bez obrazy, ale twój przykład potwierdza kolega o nie dziedziczeniu. Ja tylko klasę przerobiłem na PHP i nie testowałem w ogóle...

Jak to o NIE dziedziczeniu?

Skoro rodzic "wykonuje" instację samego siebie, a dziecko które próbuje wykonać instancję i posiada instancję taką, jaką postada rodzic to singleton jest dziedziczony (przekazywany dziecku). (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Athlan 10.03.2007, 19:16:09
Go to the top of the page
+Quote Post
splatch
post
Post #3





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

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


Cytat(Athlan @ 10.03.2007, 19:15:30 ) *
Jak to o NIE dziedziczeniu?

Skoro rodzic "wykonuje" instację samego siebie, a dziecko które próbuje wykonać instancję i posiada instancję taką, jaką postada rodzic to singleton jest dziedziczony (przekazywany dziecku). (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Nie. self jest zależny od kontekstu metody. Jeśli metoda Instance() jest zadeklarowana w klasie HelloWorld to odnosi się do HelloWorld. Jeżeli zatem odwołujesz się do HelloWorldChildren::Instance nie nadpisując tej metody to kontekst się nie zmienia i jest to wciąż HelloWorld. W Javie odwołania statyczne np są zawsze zależne od klasy z której wywołanie następuje, czyli w HelloWorld.Instance() zwróci instancję HelloWorld i logicznie HelloWorldChildren.Instance() zwróci instancję HelloWorldChildren.

Zwróć uwagę, że $this zachowuje się inaczej i nie jest zależne od metody a od klasy. To jest po prostu bug w PHP. W metodzie statycznej nie jesteś w stanie pobrać nazwy klasy, z której została ona wywołana.
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: 17.10.2025 - 04:28