Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czy to jakis bug ?
Forum PHP.pl > Forum > PHP > Object-oriented programming
a79rtur
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.
dr_bonzo
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.
Sedziwoj
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.
a79rtur
Sedziwoj dobrze prawi smile.gif
nie znam Javy ale chetnie sie dowiem jak wyglada tworzenie obiektow itp od strony kompilatora php
Cysiaczek
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 : )
Sedziwoj
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ę.
LBO
Cytat(Cysiaczek @ 11.12.2006, 19:06:37 ) *
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:

  1. <?php
  2. abstract class AbstractClassA
  3. {
  4. public function method()
  5. {
  6. print __METHOD__;
  7. }
  8. }
  9.  
  10. class ClassB extends AbstractClassA
  11. {}
  12.  
  13. $b = new ClassB();
  14. $b->method();
  15. ?>

Wyświetli AbstractClassA::method, a nie - wg tego co napisałeś - ClassB::method.
Cysiaczek
@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.
  1. <?php
  2. abstract class AbstractClassA
  3. {
  4. public function ImAmethod()
  5. {
  6. print __METHOD__;
  7. }
  8. }
  9.  
  10. class ClassB extends AbstractClassA
  11. {
  12. function ImBmethod(){}
  13. }
  14.  
  15. $b = new ClassB();
  16. print '<pre>';
  17.  
  18. $b->ImAmethod();
  19.  
  20. print '<br />';
  21.  
  22. print_r(get_class_methods($b));
  23.  
  24. print '</pre>';
  25.  
  26. /*
  27. wyświetli:
  28.  
  29. AbstractClassA::ImAmethod
  30. Array
  31. (
  32. [0] => ImBmethod
  33. [1] => ImAmethod
  34. )
  35.  
  36.  
  37. */
  38. ?>


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