Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nazwa klasy potomnej w rodzicu
Forum PHP.pl > Forum > PHP > Object-oriented programming
czachor
Czy da się uzyskać w klasie rodzicu nazwę klasy potomnej? Użycie is_subclass_of" title="Zobacz w manualu PHP" target="_manual odpada, bo nie będę wiedział w klasie rodzicu, jaka klasa będzie dziedziczyć...

  1. <?php
  2. class tata
  3. {
  4.    public function __construct()
  5.    {
  6.        echo 'Moim dzieckiem jest '; //i co tutaj...? oczekiwany rezultat: "Moim dzieckiem jest Janek"
  7.    }
  8. };
  9.  
  10. class Janek extends tata
  11. {
  12.    public function __construct()
  13.    {
  14.        parent::__construct();
  15.    }
  16. }
  17. ?>
nevt
a jaka potrzeba skłania cię do takiej konstrukcji? generalnie nie ma ona większego sensu ponieważ ta sama klasa rodzica może mieć wiele klas potomnych w dodatku wielopokoleniowych smile.gif
czachor
Chodzi o to, że klasa "tata" posiada kilka metod, z których korzystają różne klasy potomne. W jednej z tych metod potrzebuję jakiegoś unikalnego stałego identyfikatora dla klasy potomnej, który najlepiej jakby był właśnie tworzony w rodzicu (np. właśnie nazwy klasy). Nie chcę robić sztywnej listy klasa-ID. Niby mogę użyć parent::... w klasie potomnej, ale kombinuję, może automatycznie jakoś... Znalazłem w manualu coś podobnego: Late Static Bindings, ale to też wymaga ode mnie ingerencji w klasy potomne, czego chciałbym uniknąć (jest ich sporo).

Być może to co robię, to przerost formy nad treścią, no ale ugryzło mnie...
Cysiaczek
Wywołaj po prostu
  1. <?php
  2. print get_class($this); //w klasie rodzica - otrzymasz nazwę klasy potomnej
  3. ?>


Spotkałem z tym problemem. Troszkę od innej strony - gdy chcemy w klasie rodzica wywołać metodę z klasy rodzica, przesłoniętą w pochodnej smile.gif
Problem można rozwiązać tylko przez kolejną metodę w klasie pochodnej
  1. <?php
  2. class A
  3. {
  4.    public function doMetohdFromB()
  5.    {
  6.        print $this->method().'<br />';
  7.        print self::method() // questionmark.gif?
  8.        
  9.    }
  10.    
  11.    public function method()
  12.    {
  13.        print 'Hi, Im method in A class<br />';
  14.    }
  15. }
  16.  
  17. class B extends A
  18. {
  19.    public function method()
  20.    {
  21.        print 'Hi, Im method in B class<br />';
  22.    }
  23. }
  24.  
  25. $o=new B();
  26. $o->doMetohdFromB();
  27. /*
  28.  * will produce
  29.  *
  30.  * Hi, Im method in B class
  31.  */
  32. ?>


A teraz:
  1. <?php
  2. class A
  3. {
  4.    public function doMetohdFromB()
  5.    {
  6.        print $this->method().'<br />';
  7.        print $this->parentMethod(); // wywołaj self::method() :)
  8.        
  9.    }
  10.    
  11.    public function method()
  12.    {
  13.        print 'Hi, Im method in A class<br />';
  14.    }
  15. }
  16.  
  17. class B extends A
  18. {
  19.    public function method()
  20.    {
  21.        print 'Hi, Im method in B class<br />';
  22.    }
  23.    
  24.    public function parentMethod()
  25.    {
  26.        print parent::method();
  27.    }
  28. }
  29.  
  30.  
  31. $o=new B();
  32. $o->doMetohdFromB();
  33. /*
  34.  * Wyprodukuje
  35.  *
  36.  * Hi, Im method in B class
  37.  * Hi, Im metthod in A class
  38.  */
  39. ?>



Pozdrawiam
czachor
Dzięki Cysiaczek. Zupełnie mi nie wpadło, żeby dodać $this do get_class() smile.gif Co do rozwiązania Twojego problemu - pozwolisz, że skorzystam winksmiley.jpg Ostatnio właśnie napotykam podobne problemy, więc na pewno przyda mi się w pracy.

Pozdr!
Sedziwoj
@Cysiaczek
Trochę to mi wygląda na jakieś kombinowanie na siłę. Jeżeli dana metoda nie może być przysłonięta, to się to blokuje, jeżeli może, to niech martwi się o działanie osoba która ją nadpisze.
dr_bonzo
Popieram Sedziwoja - cos zes Cysiaczek namieszal smile.gif
empathon
http://www.php.net/manual/en/language.oop5...reflectionclass

getParentClass
Cysiaczek
Nic nie namieszałem blink.gif
Chodziło mi o wywołanie własnej wersji metody przez klasę rodzicielską, której dziecko ją przesłoniło. To, ze można dać final, private itd. to wiadomo. Nie karzę nikomu stosować tego, co napisałem - ot ciekawostka, jak takie coś można w php zrobić i tyle. Miałem taką sytuację raz i uznałem, że popełniłem błąd projektowy smile.gif

Pozdrawiam
@empathon - thumbsupsmileyanim.gif
Sedziwoj
Cytat(Cysiaczek @ 27.10.2008, 17:08:32 ) *
Miałem taką sytuację raz i uznałem, że popełniłem błąd projektowy smile.gif

No i dla tego powinieneś to zaznaczyć, aby ktoś sobie nie pomyślał że to normalna i poprawna praktyka.
Bo wiadomo że się robi czasem brzydkie rzeczy, ale jak się z tego forum ludzie uczą, to niech chociaż dobrze ;]
starach
No dobra a co z klasą statyczną. Właśnie się natknąłem na ten problem.
  1. <?php
  2. class A
  3. {
  4.    public static function test()
  5.    {
  6.        return ; //Jak zwrócić nazwę klasy rodzica
  7.    }
  8. }
  9. class B extends A { }
  10. echo B::test();
  11. ?>
Jak takie wywołanie metody test() ma zwrócić nazwę klasy dziecka. Przykład może nieco archaiczny więc dam jeszcze inny.
Rozszerzanie klasy która jest singletonem. Jak pobrać w metodzie getInstance() nazwę klasy rodzica, żeby nie trzeba było nadpisywać tej metody w klasie potomnej?
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.