Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dziwny problem z dziedziczeniem
Forum PHP.pl > Forum > PHP > Object-oriented programming
popsit
Witam,

przebudowuje caly system na OOP, do tej pory wszystko szlo jak nalezy az do dzis jak musze dobrac sie do danych klasy rozszerzajacej...

zaczynajac od podstaw, standardowo korzystam z methody __autoload(); by wykorzystywane klasy byly wgrywane automatycznie.

klasa rozruchowa jest Core(), dokladny schemat wyglada nastepująco:

PM -> Registry -> Template -> Modules -> Core ( Core rozszerza Modules, Modules rozszerza Templates etc )

W Core() dodatkowe moduly jak Db,Xml wgrywam nastepująco:

  1. <?php
  2. private function __loadModules( $type,$sub_type=null )
  3. {
  4.    if( isset( $sub_type ) )
  5.    {
  6.        $modules =  $this->{'_core_'.$type}[$sub_type];
  7.    }
  8.    else
  9.    {
  10.        $modules =  $this->{'_core_'.$type};
  11.    }
  12.    
  13.    // $modules to zwykly array(), z wymienionymi glownymi klasami rozszerzajacymi
  14.    // np array( 'Db','Xml','KolejnaKlasa' );
  15.    foreach ( $modules as $module )
  16.    {
  17.        $module_var = $module;
  18.        
  19.        if(method_exists($module, 'init'))
  20.        {
  21.            $this->_instances[$module_var] = call_user_func(array($module, 'init'), $module, $this);
  22.        }
  23.        else
  24.        {
  25.            $this->_instances[$module_var] = new $module();
  26.        }
  27.        
  28.        if(isset($this->_instances[$module_var]))
  29.        {
  30.            $this->$module_var = $this->_instances[$module_var];
  31.        }
  32.        else
  33.        {
  34.            throw new PMException();
  35.        }
  36.    }
  37. }
  38. ?>


natomiast w root'cie ( PM(); ), wszystkie isntancje sa wgrywane jak statyczne:

  1. <?php
  2. public                $Core;
  3. protected static     $instances    = array();
  4.  
  5. public static function init($class = null, $core = null)
  6. {
  7.    if(empty($class))
  8.    {
  9.        $class = get_class();
  10.    }
  11.    if(!isset(self::$instances[$class]))
  12.    {
  13.        self::$instances[$class] = new $class();
  14.    }
  15.    if($core)
  16.    {
  17.           self::$instances[$class]->Core = $core;
  18.    }
  19.    
  20.    return self::$instances[$class];
  21. }
  22. ?>


i teraz durne pytanie...

1. dlaczego odwolujac sie z klasy Tempates() do Core() jak uzywam "$this->Core->xxx()" wywala blad
- Notice: Trying to get property of non-object
- Fatal error: Call to a member function xxx() on a non-object
- natomiast $this->xxx() dziala bez zarzutu z malym ale, nie mam dostepny do klas rozszerzajacych Core(), gdzie jest to idiotyczne, z tej racji iz wszystko jest zdefiniowane jak statyczne w root'cie ( PM() )

2. dlaczego jak sie odwoluje z klasy roszerzajacej Core() zalozmy Url();
- w klasie Core->Db mam zdefiniowana methode safeString();
- by kazda klasa automatyczni ja dziedziczyla w PM() mam zdefiniowane safeString() z return $this->Core->Db->safeString();
- wywolanie z Core->Url->mathoda_korzystaja_z_safeString() dziala bez problemu
- wywolanie $this->safeString() z Core() wywala blad i tak we wszystkich innych klasach ktore rozszerza ;/


Jak to nie jest wytarczajaco zrozumialem sformulowane prosze o uwage, i naprawde bede wdzieczny za pomoc winksmiley.jpg
megawebmaster
1. Czemu nie skorzystać z magicznych metod __get(), __set(), żeby ułatwić sobie życie?
2. Dlaczego dziedziczysz w ten sposób? Przecież o wiele wygodniejsze jest tworzenie kilku obiektów, bo bezproblemowo można je wymienić i łatwiej z nich korzystać.
3. W klasie Templates jeszcze nie ma żadnej wiadomości, ani informacji o klasie Core (wg. tego co piszesz).
4. Strasznie zawile piszesz.
popsit
1. przeciez statyczne metody sa rowniez ulatwieniem zycia
2. nauczylem sie wten sposob rekurencyjnie dziedziczyc i jakos weszlo w nawyk, zawsze wole zobaczyc linijke kodu niz tekstu komentarza....
3. ale oczywiscie ze jest statyczne PM->init(); wywoluje wszystkie klasy rozszezrazjace ( z poziomu Core ) oraz rozszezrone, dlatego tez klasa Template jest wywolana i ma ustawiony "skrot" do Core poprzez $this->Core, sprawdzilem i dobrze nadaje cechy, gorzej z praktyka, z templates wywolanie nei dziala...
4. wiem smile.gif pisanie tekstów nie jest moja mocna stona

pozdrawiam,
hasinski

problem rozwiazany, jak to bywa najprostsze wydaje sie zawsze najtrudnieje lub jest pomijane winksmiley.jpg

prosze o zamkniecie tematu
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.