a79rtur
10.12.2006, 19:03:20
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
10.12.2006, 19:49:37
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
10.12.2006, 22:56:21
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
11.12.2006, 18:42:02
Sedziwoj dobrze prawi

nie znam Javy ale chetnie sie dowiem jak wyglada tworzenie obiektow itp od strony kompilatora php
Cysiaczek
11.12.2006, 19:06:37
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
11.12.2006, 19:37:29
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ę.
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:
<?php
abstract class AbstractClassA
{
public function method()
{
}
}
class ClassB extends AbstractClassA
{}
$b = new ClassB();
$b->method();
?>
Wyświetli
AbstractClassA::method, a nie - wg tego co napisałeś -
ClassB::method.
Cysiaczek
24.12.2006, 10:52:15
@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.
<?php
abstract class AbstractClassA
{
public function ImAmethod()
{
}
}
class ClassB extends AbstractClassA
{
function ImBmethod(){}
}
$b = new ClassB();
$b->ImAmethod();
/*
wyświetli:
AbstractClassA::ImAmethod
Array
(
[0] => ImBmethod
[1] => ImAmethod
)
*/
?>
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.