Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> singleton i dziedziczenie
ksiadz
post 20.05.2005, 19:02:48
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 24.11.2003

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


mam problem z singletonem przez dziedziczenie a mianowicie napisalem taki kod
  1. <?php
  2.  
  3. class system
  4. {
  5. protected static $instance;
  6.  
  7. protected function __construct()
  8. {}
  9.  
  10. public static function get_instance()
  11. {
  12. if( self::$instance === false )
  13. {
  14. self::$instance = new self();
  15. }
  16.  
  17. return self::$instance;
  18. }
  19. }
  20.  
  21. class innysystem extends system
  22. {
  23. public function main_run()
  24. {
  25. }
  26. }
  27.  
  28. $system = innysystem::get_instance();
  29. $system->main_run();
  30.  
  31. ?>

ale podczas pobierania referencji przez funkcje get_instance() tworzy sie nowy obiekt z tym ze jest to 'system' a nie 'innysystem' wiec jak to najprosciej naprawic by we wszystkich klasach potomnych nie trzebabylo wklepywac tej samej funkcji get_instance() ?


--------------------
If you can't find a program that does what you want it to do, then write your own.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
dr_bonzo
post 20.05.2005, 19:16:51
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Niestety musisz recznie dopisac get_instance() dla kazdej z klas pochodnych. Jako ze nie przeciazyles tej metody w klasie pochodnej, get_instance() bedzie zawsze wywolywana dla obiektu klasy nadrzednej.

Ten post edytował dr_bonzo 20.05.2005, 19:24:57


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Imperior
post 21.05.2005, 13:14:12
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 16.10.2004

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


Co gorsza, nie da się (przynajmniej ja nie mogłem) pobrać nawet nazwy tej "rzeczywistej" klasy.


--------------------
Com powiedział, powiedziałem.
Go to the top of the page
+Quote Post
dr_bonzo
post 21.05.2005, 13:55:38
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Nawet get_class() nie dziala sad.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
ksiadz
post 21.05.2005, 16:24:58
Post #5





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 24.11.2003

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


jedyne co mi sie udalo uzyskac to tylko to
  1. <?php
  2.  
  3. class system
  4. {
  5. protected static $instance = array();
  6.  
  7. protected function __construct()
  8. {}
  9.  
  10. public static function get_instance( $classname=__CLASS__ )
  11. {
  12. if( ! isset( self::$instance[ $classname ] ) )
  13. {
  14. self::$instance[ $classname ] = new $classname();
  15. }
  16.  
  17. return self::$instance[ $classname ];
  18. }
  19. }
  20.  
  21. class innysystem extends system
  22. {
  23. public static function get_instance()
  24. {
  25. return parent::get_instance( __CLASS__ );
  26. }
  27.  
  28. public function main_run()
  29. {
  30. }
  31. }
  32.  
  33. $system = innysystem::get_instance();
  34. $system->main_run();
  35.  
  36. ?>

moze ktos ma lepszy pomysl na dziedziczenie singletona dry.gif


--------------------
If you can't find a program that does what you want it to do, then write your own.
Go to the top of the page
+Quote Post
dr_bonzo
post 21.05.2005, 17:07:42
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


No i chcesz stworzyc instancje klasy 'innysystem'
  1. <?php
  2. $blabla = innysystem::get_instance();
  3. ?>

co konczy sie wywolaniem:
  1. <?php
  2. new innysystem();
  3. ?>

Aby to wywolanie bylo mozliwe -- konstruktor klasy innysystem musi byc publiczny, a jak jest publiczny to mozna stworzyc obiekt w sposob tradycyjny, co burzy koncepcje singletona.

A poza tym skoro juz implementujesz metode get_instance() w klasie pochodnej to po prostu napisz ja tak jak w klasie 'system'.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Bora
post 27.07.2005, 13:26:56
Post #7





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


  1. <?php
  2. class Container
  3. {
  4.    private static $container = array();
  5.  
  6.    private static $instance;
  7.  
  8.    private function __construct()
  9.  
  10.     public static function getInstance()
  11.     {
  12.         if( self::$instance === false )
  13.         {
  14.             self::$instance = new self();
  15.         }
  16.  
  17.         return self::$instance;
  18.     }
  19.  
  20.    public static function get( $name )
  21.    {
  22.       if( isset( self::$container[ $name ] ) )
  23.       {
  24.          return self::$container[ $name ];
  25.       }
  26.    }
  27.    
  28.    public static function set( $name, $value )
  29.    {
  30.       self::$container[ $name ] = $valule;
  31.    }
  32. }
  33. class Module
  34. {
  35.    static $modules = array();
  36.    
  37.    public static function _get( $name )
  38.    {
  39.       $container = Container::GetInstance(); 
  40.       $container->get($name);
  41.    }
  42.    
  43.    public static function _set( $name, $value )
  44.    {
  45.       $container = Container::GetInstance(); 
  46.       $container->get($name, $valule); 
  47.    }
  48. }
  49.  
  50. class Core extends Module
  51. {
  52. }
  53.  
  54. class Shop extends Module
  55. {
  56. }
  57.  
  58. $core = new Core;
  59. $shop = new Shop;
  60.  
  61. $core->test = 'Testujemy';
  62.  
  63. echo 'Core: '.$core->test.'<br/>Shop: '.$shop->test;
  64. ?>

pisane w locie ale powinno zadzialac.

widze ze piszac w pospiechu pomylilem tematy: http://forum.php.pl/index.php?showtopic=33537

Ten post edytował Bora 2.08.2005, 13:07:55
Go to the top of the page
+Quote Post
dag
post 30.07.2005, 00:37:04
Post #8





Grupa: Zarejestrowani
Postów: 180
Pomógł: 0
Dołączył: 24.12.2003

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


Hmm IMHO jest to błąd projektowy. Jeśli używać wzorca projektowego SINGLETON to tylko w ten sposób do jakiego jest zalecany, czyli do zwracania referencji obiektu i uniemożliwienie tworzenia nowych obiektów.

Jeśli już musisz dziedziczyć po jakieś klasie to lepiej rozbić tę klasę. IMHO będzie to lepsze rozwiązanie i czytelniejsze z projektowego punktu widzenia.


--------------------

------------------------------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
NuLL
post 6.08.2005, 14:00:25
Post #9





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


A co sądzicie o pomyśle na singletonFactory :?: Chyba wiadomo o co chodzi smile.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
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: 24.07.2025 - 16:37