Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> czy to jakis bug ?, php5 abstract class
a79rtur
post
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.
Go to the top of the page
+Quote Post
dr_bonzo
post
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.
Go to the top of the page
+Quote Post
Sedziwoj
post
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.
Go to the top of the page
+Quote Post
a79rtur
post
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
Go to the top of the page
+Quote Post
Cysiaczek
post
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 : )
Go to the top of the page
+Quote Post
Sedziwoj
post
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ę.
Go to the top of the page
+Quote Post
LBO
post
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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.

Ten post edytował LBO 24.12.2006, 02:58:59
Go to the top of the page
+Quote Post
Cysiaczek
post
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.
  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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 22:27