Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Uniwersalna klasa Singleton, Napisana raz, wykorzystywana wiele...
tompaw
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 7.11.2004

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


Witam forumowiczow.

W swoim projekcie chcialem wykorzystac klasy Singleton. Nie chce jednak w kazdej z nich tworzyc osobno tego samego mechanizmu (czyli funkcji get_instance). Postanowilam napisac klase Singleton, a pozostale tworzyc w oparciu o nia. Niestety, pojawil sie problem.

Klasa Singleton wyglada tak:

  1. <?php
  2. class Singleton {
  3.  
  4. private static $instance = null;
  5.  
  6. private function __construct() {
  7. }
  8.  
  9. public static function GI() {
  10. if (self::$instance == null) {
  11. self::$instance = new Singleton;
  12. }
  13.  
  14. return self::$instance;
  15. }
  16. };
  17. ?>


Pozniej pojawia sie jakas prosta klasa pochodna i wywolanie jej metody:

  1. <?php
  2. class Controller extends Singleton {
  3.  
  4. // stuff here...
  5.  
  6. function test() {
  7. }
  8.  
  9. };
  10.  
  11. Controller::GI()->test();
  12. ?>


Oczywiscie ten kod zwroci blad:

Fatal error: Call to undefined method Singleton::test() in test.php on line x

i jest to zrozumiale. Problem tkwi w jednej linijce metody Singleton::GI(), a mianowicie:

  1. <?
  2. self::$instance = new Singleton;
  3. ?>


Przez to metoda ta jest na sztywno przypisana do klasy Singleton, ktora w moim przypadku jest klasa czysto wirtualna, tzn chce, aby sluzyla jako podstawa dla innych klas.

Moje pytanie brzmi: jak sprawic, aby tworzony byl obiekt nie klasy Singleton, ale klasy pochodnej od niej, na rzecz ktorej wywolywana jest metoda GI() ?

Probowalem dostac sie do nazwy tej klasy dwojako: przez get_class() oraz __CLASS__. Niestety, zawsze zwracana jest klasa Singleton.

Z gory dzieki za pomoc, pozdrawiam.

Ten post edytował tompaw 7.11.2004, 13:04:21
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
hawk
post
Post #2





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Bo to będzie Rejestr. Była jeszcze jakaś inna, mądrzejsza nazwa, ale nie zmienia to faktu, że rejestr to nie singleton. Inny wzorzec.

Bo Singleton służy do teo, aby była tylko jedna instancja klasy, a w twoim przykładzie w ogóle nie będzie żadnej instancji klasy Singleton.

Bo w zależności od tego co podamy, dostajemy obiekty różnej klasy, a singleton powinien zawsze dawać tą samą instancję.

Po prostu - inny wzorzec. Ani lepszy, ani gorszy, ale na pewno nie singleton. Co nie zmienia faktu że rejestry często są przy okazji singletonami.
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: 13.10.2025 - 23:14