Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Singleton w praktyce
lukasz91
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


Witam,
właśnie uczę się o wzorcu singleton. W teorii już wiem o co tam chodzi. Byłbym wdzięczny jakby ktoś lakonicznie przedstawił jak używać tego w praktyce (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


Już chyba wiem co chcesz zrobić z tym singletonem. I muszę cię zmartwić - nie zadziała ci to tak jak chcesz. Problem jest taki, że pola statyczne nie są w żaden sposób powiązane z obiektami. Tzn. można powiedzieć, że są współdzielone przez wszystkie obiekty klasy i obiekty jej klas pochodnych. Przeanalizuj ten kod (wymaga PHP 5.3, jeśli masz starszą wersję zamień new static na new self, ale to zrobi jeszcze większy burdel):
  1. <pre>
  2. <?php
  3.  
  4. class Main_Controller
  5. {
  6. private static $instance;
  7.  
  8. protected function __construct() { }
  9.  
  10. public static function getInstance()
  11. {
  12. if( !self::$instance )
  13. {
  14. self::$instance = new static();
  15. }
  16.  
  17. return self::$instance;
  18. }
  19. }
  20.  
  21. class Foo_Controller extends Main_Controller
  22. {
  23. public $foo = 123;
  24. }
  25.  
  26. class Bar_Controller extends Main_Controller
  27. {
  28. public $bar = 456;
  29. }
  30.  
  31. $fooInstance = Foo_Controller::getInstance();
  32. $barInstance = Bar_Controller::getInstance();
  33.  
  34. var_dump( $fooInstance );
  35. var_dump( $barInstance );
  36.  
  37. ?>
  38. </pre>


Rozwiązaniem jest zastosowanie wzorca fabryka.
Ewentualnie możesz przerobi singleton w taki sposób, żeby korzystał z tablicy nazwa_klasy => obiekt_klasy:
  1. <pre>
  2. <?php
  3.  
  4. class Main_Controller
  5. {
  6. private static $instances = array();
  7.  
  8. protected function __construct() { }
  9.  
  10. public static function getInstance()
  11. {
  12. $controllerClass = get_called_class();
  13. if( !array_key_exists( $controllerClass, self::$instances ) )
  14. {
  15. self::$instances[$controllerClass] = new static();
  16. }
  17.  
  18. return self::$instances[$controllerClass];
  19. }
  20. }
  21.  
  22. class Foo_Controller extends Main_Controller
  23. {
  24. public $foo = 123;
  25. }
  26.  
  27. class Bar_Controller extends Main_Controller
  28. {
  29. public $bar = 456;
  30. }
  31.  
  32. $fooInstance = Foo_Controller::getInstance();
  33. $barInstance = Bar_Controller::getInstance();
  34.  
  35. var_dump( $fooInstance );
  36. var_dump( $barInstance );
  37.  
  38. ?>
  39. </pre>


Do poczytania:
http://php.net/manual/en/language.oop5.lat...ic-bindings.php
get_called_class
Go to the top of the page
+Quote Post

Posty w temacie
- lukasz91   Singleton w praktyce   25.07.2011, 17:44:44
- - wookieb   Nie używać tego w praktyce. http://forum.php.pl/in...   25.07.2011, 17:49:50
|- - starach   Cytat(wookieb @ 25.07.2011, 18:49:50 ...   26.07.2011, 01:56:35
- - lukasz91   hmm w takim może polecicie jakieś materiały o budo...   25.07.2011, 19:31:02
- - michaJlS   Całkiem fajne opisy: http://www.oodesign.com/   25.07.2011, 19:45:19
- - Rid   Context ,nie zawsze jest dobry szczególnie w połąc...   26.07.2011, 02:12:34
- - wookieb   Bo nie serializuje się obiektów z kontekstem. Poza...   26.07.2011, 07:20:46
- - Rid   To trzeba powiedzieć Panom z Microsoftu bo utworzy...   26.07.2011, 13:10:45
- - wookieb   Wartości typu resource (połączenia, curl, uchwyty ...   26.07.2011, 13:55:57
- - Rid   Alternatywa dla context Thread Local Storage,co o ...   29.08.2011, 14:23:36
- - dariuszp   Dlaczego ktoś tu mówi że nie należy stosować wzorc...   30.08.2011, 09:52:38
- - wookieb   Pisałeś kiedyś testy jednostkowe? Zajmowałeś się p...   30.08.2011, 10:04:29
- - Sagnitor   Zadam pytanie ciut odbiegające od głównego tematu....   31.08.2011, 12:06:12
|- - by_ikar   Cytat(Sagnitor @ 31.08.2011, 13:06:12...   31.08.2011, 13:38:10
- - Rid   Ja się chyba bardziej zainteresuję wzorcem TLS ....   31.08.2011, 14:06:29
|- - Sagnitor   Cytat(Rid @ 31.08.2011, 15:06:29 ) Ja...   31.08.2011, 14:14:40
- - Rid   Ja pracuję w C# wzorzec jest dopracowany,w rubym,J...   31.08.2011, 14:18:27
- - adbacz   Kurcze, tak czytam o tym singletonie ale nijak nie...   16.10.2011, 00:52:14
- - wookieb   W php 5 te wszystkie & jako wskaźniki referenc...   16.10.2011, 08:24:46
- - adbacz   Mógłbyś mi wytłumaczyć dlaczego powinno się uniemo...   16.10.2011, 17:36:10
- - Daiquiri   Cytat(adbacz @ 16.10.2011, 18:36:10 )...   16.10.2011, 18:04:59
- - adbacz   Dobrze, a co gdy klasa dziedziczy po głównym kontr...   16.10.2011, 21:39:03
|- - mike   Cytat(adbacz @ 16.10.2011, 22:39:03 )...   16.10.2011, 21:53:14
- - adbacz   Mam główny kontroler, w którym na samym początku p...   16.10.2011, 22:29:14
- - Noidea   Tzn. masz kod, który tworzy obiekt Main_Controller...   16.10.2011, 22:54:00
- - adbacz   Chyba źle wytłumaczyłem. najpierw jest uruchamiany...   16.10.2011, 23:37:26
- - Daiquiri   Nie mam pewności - ale czy Ty aby przypadkiem nie ...   17.10.2011, 08:32:49
- - Noidea   Już chyba wiem co chcesz zrobić z tym singletonem....   17.10.2011, 12:52:16
- - adbacz   Wiecie co, naczytałem się o Wzorcach Projektowych,...   19.10.2011, 00:26:01
- - Orzeszekk   a powiedzcie mi czy takie cos to tez jest wzorzec ...   7.11.2011, 23:56:51


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: 7.10.2025 - 05:38