Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Uniwersalna klasa Singleton, Napisana raz, wykorzystywana wiele...
tompaw
post 7.11.2004, 12:33:33
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
bela
post 7.11.2004, 13:27:00
Post #2


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


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


moze cos takiegO ?

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


zle sie odwołujesz powinienes
  1. <?php
  2. $object = object::GI();
  3. $object->test();
  4.  
  5. ?>


--------------------
Go to the top of the page
+Quote Post
tompaw
post 7.11.2004, 13:31:13
Post #3





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

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


Tylko ze z Twoja propozycja to trzeba by wywolywac funkcje:

ClassName::GI("ClassName")

tak ?

Dlaczego wywolanie Controller::GI()->test(); jest wg Ciebie zle ?
Go to the top of the page
+Quote Post
hawk
post 8.11.2004, 09:33:38
Post #4





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

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


Odwołanie Controller::GI()->test() jest jak najbardziej poprawne.

To co bela666 proponuje to już nie będzie singleton.

@tomapaw: tego się raczej nie da zrobić. Nie tylko w php, w innych językach również. Chociaż w php miałoby to większe szanse powodzenia, bo php jest interpretowany.
Go to the top of the page
+Quote Post
bela
post 8.11.2004, 15:27:29
Post #5


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Cytat(hawk @ 2004-11-08 10:33:38)
To co bela_666 proponuje to już nie będzie singleton.

a czemu ?


--------------------
Go to the top of the page
+Quote Post
hawk
post 8.11.2004, 16:13:57
Post #6





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
tompaw
post 8.11.2004, 18:53:20
Post #7





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

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


hm... rozwiazalem to w ten sposob:

  1. <?
  2.  
  3. class Singleton {
  4.  
  5. private static $instance = null;
  6.  
  7. private function __construct() {
  8. }
  9.  
  10. public static function &GetInstance($name) {
  11. if (self::$instance[$name] == null) {
  12. self::$instance[$name] = & new $name; 
  13. }
  14.  
  15. return self::$instance[$name];
  16. }
  17. };
  18.  
  19. class SingletonManager {
  20.  
  21. function &GI($type) {
  22. eval(&#092;"$new_object = \".$type.\"::GetInstance(\"\".$type.\"\");\");
  23. return $new_object;
  24. }
  25.  
  26. }
  27.  
  28. ?>


opinie, komentarze, itp ;>
Go to the top of the page
+Quote Post
Vengeance
post 8.11.2004, 20:41:46
Post #8





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


a na ciorta tak ?

jak masz tą pierwszą klase to mozesz juz

Singleton::GetInstance('jakasklasa');
czyba nie ?


--------------------
Go to the top of the page
+Quote Post
bela
post 8.11.2004, 20:50:44
Post #9


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Cytat(tompaw @ 2004-11-08 19:53:20)
hm... rozwiazalem to w ten sposob:

  1. <?
  2.  
  3. class Singleton {
  4.  
  5. private static $instance = null;
  6.  
  7. private function __construct() {
  8. }
  9.  
  10. public static function &GetInstance($name) {
  11. if (self::$instance[$name] == null) {
  12. self::$instance[$name] = & new $name; 
  13. }
  14.  
  15. return self::$instance[$name];
  16. }
  17. };
  18.  
  19. class SingletonManager {
  20.  
  21. function &GI($type) {
  22. eval(&#092;"$new_object = \".$type.\"::GetInstance(\"\".$type.\"\");\");
  23. return $new_object;
  24. }
  25.  
  26. }
  27.  
  28. ?>


opinie, komentarze, itp ;>

przecież hawk powiedział, że to nie singleton dry.gif


--------------------
Go to the top of the page
+Quote Post
tompaw
post 9.11.2004, 00:27:43
Post #10





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

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


Cytat(Vengeance @ 2004-11-08 19:41:46)
a na ciorta tak ?

jak masz tą pierwszą klase to mozesz juz

Singleton::GetInstance('jakasklasa');
czyba nie ?

jak tak teraz na to patrze to chyba rzeczywiscie =]
Go to the top of the page
+Quote Post
hawk
post 9.11.2004, 09:10:42
Post #11





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

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


Tylko dlaczego w kółko pojawiają się wątki o singletonie, które kończą się tym, że singleton jest olewany i staje na czymś zupełnie innym?

Singleton - najbardziej nadużywany wzorzec wszechczasów.
Go to the top of the page
+Quote Post
Ozzy
post 10.11.2004, 10:07:52
Post #12





Grupa: Zarejestrowani
Postów: 204
Pomógł: 0
Dołączył: 26.12.2003
Skąd: Rzeszów

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


http://zend.com/zend/week/week209.php => TLK: New overloading feature?
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 Wersja Lo-Fi Aktualny czas: 17.06.2025 - 08:10