Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> nazwa klasy potomnej w rodzicu, jak uzyskać?
czachor
post 23.10.2008, 15:29:38
Post #1





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


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. ?>


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
nevt
post 23.10.2008, 19:40:21
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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


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

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
czachor
post 23.10.2008, 19:55:34
Post #3





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


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...


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
Cysiaczek
post 23.10.2008, 19:59:14
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
czachor
post 23.10.2008, 22:48:33
Post #5





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


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!


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
Sedziwoj
post 27.10.2008, 11:44:15
Post #6





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@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.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
dr_bonzo
post 27.10.2008, 13:57:25
Post #7





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

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


Popieram Sedziwoja - cos zes Cysiaczek namieszal smile.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
empathon
post 27.10.2008, 14:12:15
Post #8





Grupa: Zarejestrowani
Postów: 246
Pomógł: 31
Dołączył: 13.11.2006
Skąd: się znamy?

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


http://www.php.net/manual/en/language.oop5...reflectionclass

getParentClass


--------------------
Goldenline: Łukasz Rodziewicz
Go to the top of the page
+Quote Post
Cysiaczek
post 27.10.2008, 16:08:32
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Sedziwoj
post 27.10.2008, 16:21:32
Post #10





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


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 ;]


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
starach
post 13.01.2009, 20:43:45
Post #11





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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?
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 - 12:38