![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 1 Dołączył: 23.05.2004 Skąd: Tarnów/Londyn Ostrzeżenie: (0%) ![]() ![]() |
witam
mam następujacą sytuacje: jest klasa abstrakcyjna : abstract class lokal() i jej klasa potomna class lokal_xml extends lokal() w klasie potomnej mam zdefiniowana metode public function createXML() a w konstruntorze klasy potomnej wywoluje konstruktor rodzica : parent::construct($lokal_id); dziwna wydaje mi sie rzecz, ze jesli do konstruktora klasy rodzica, dodam wywolanie $this->createXML(), to php nie zglasza zadnego bledu. wydaje mi sie ze powinno, poniewaz wywoluje metode, ktora jest zadeklarowana i zdefiniowana dopiero w klasie potomniej. jesli sie myle to prosze o wytlumaczenie o co chodzi. |
|
|
![]()
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%) ![]() ![]() |
php to nie Java, $this->createXML() jest wywolywane na obiekcie klasy pochodnej (dynamiczne wiazanie) i widocznie php nie potrzebuje miec tej metody zdefiniowanej w klasie rodzica, i widocznie definiowanie metod abstrakcyjnych przydaje sie tylko do zrozumienia kodu/struktury klas i metod.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dokładnie pomiędzy Java a php są i to olbrzymie różnice.
Może by ktoś podstawił jakiś ciekawy artykuł dotyczący właśnie takich zagadnień? Chodzi o to jak naprawdę tworzone są obiekty w php, bo chodzi o choćby takie rzeczy jak który konstruktor jest pierwszy uruchamiany (jak jest odwołanie to zgodnie z kolejnością kodu czy nie?) itp. itd. bo można to przetestować ale przydała by się skondensowana wiedza. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 1 Dołączył: 23.05.2004 Skąd: Tarnów/Londyn Ostrzeżenie: (0%) ![]() ![]() |
Sedziwoj dobrze prawi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
nie znam Javy ale chetnie sie dowiem jak wyglada tworzenie obiektow itp od strony kompilatora php |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Ja nie widzę w tym nic dziwnego.
Kiedy w konstruktorze klasy potomnej wywołasz parent::__construct otrzymasz w pełni skonstruowany obiekt. Jeśli tego nie zrobisz - otrzymujesz obiekt częściowo skonstruowany. Podobno w następnych wersjach konstruktor w klasie bazowej ma być wywoływany automatycznie. Wracając do wywołania metody klasy pochodnej z klasy bazowej: Kiedy zostanie utworzona instancja klasy, nie ma podziału na klasę bazową i potomną - mamy jeden obiekt, który zawiera wszystkie metody z wyjątkiem metod prywatnych klasy bazowej. Zatem odwołanie się do metody należącej przy deklarowaniu do klasy pochodnej nie ma związku z kolejnością tejże deklaracji. Osobiście korzystam podobnych schematów, bo ograniczają ilość powtórzonego kodu, zwłaszcza, jeśli istnieje duża ilość klas pochodnych. Pozdrawiam. P.S Przyłączam się do prośby kolegów : ) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Mimo wszystko kompilator powinien ostrzec co najmniej, bo jeśli w tej klasie abstrakcyjnej była by zadeklarowana funkcja abstrakcyjna o nazwie createXML to już by nie było by kłopotu.
A co do konstruktora, to może lepsze by było takie rozwiązanie jak w Java tzn. jeśli klasa potomna nie ma konstruktora o danych parametrach (php akurat na to nie zwraca uwagi, tak wnioskuję ale nie testowałem) to wywołuje konstruktora klasy z której dziedziczy. P.S. @Cysiaczek może powinieneś robić to co napisałem (jeśli nie robisz) to znaczy tworzyć abstrakcje aby zabezpieczyć się, że klasa pochodnia będzie miała tą metodę. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Kiedy zostanie utworzona instancja klasy, nie ma podziału na klasę bazową i potomną - mamy jeden obiekt, który zawiera wszystkie metody z wyjątkiem metod prywatnych klasy bazowej. Mylisz się. Wystarczy jedno małe doświadczenie:
Wyświetli AbstractClassA::method, a nie - wg tego co napisałeś - ClassB::method. Ten post edytował LBO 24.12.2006, 02:58:59 |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
@LBO - faktycznie, przegalopowałem. Miałem na myśli, że nie ma podziału na obiekt bazowy i obiekt potomny. Zresztą rozbudowując nieco twój przykład.
Właśnie o to zawieranie się metody w obiekcie mi chodzi : ) Wracając do tematu Ze względu na powyższe nie można mieć pretensji do php, że nie wywala błędów, jeśli klasa bazowa korzysta z metod klasy potomnej. Robi to w kontekście obiektu. Pozdrawiam. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 22:27 |