Autor Zpráva
WanTo
Profil
Je možné v PHP4 používat abstraktní metody?
llook
Profil
Ne, není.
WanTo
Profil
A ještě jeden dotaz - budu mít dvě třídy, pro jednoduchost je pojmenujme Rodič a Syn.

class Rodič {
function Rodič() {
udelejNeco();
}
function udelejNeco() {} //prázdná, bude překrytá v Synovi
}

class Syn extends Rodič {
function udelejNeco() {
echo "aaa";
}
}


Pak vytvořím novou instanci třídy Syn:

$syn = new Syn();


Která udelejNeco() se zavolá? Ta z Rodiče, ze Syna nebo vůbec žádná?
mila
Profil
Ne, není.
Není možno napsat k metodě slovo abstract. Jinak abstraktní metody klidně používat lze.

function foo () {
trigger_error ("Sorry, I'm abstract.", E_USER_ERROR)
}
WanTo
Profil
mila
To sice možná funguje, ale abstraktní to není :-)
mila
Profil
Která udelejNeco() se zavolá? Ta z Rodiče, ze Syna nebo vůbec žádná?
Ze syna. Bez toho by OOP přišlo o polovinu svých výhod.
mila
Profil
WanTo
Metoda není abstraktní, protože má u sebe slovo abstract, ale jak se používá.
To že nemůže být přímo volána, je pomůcka pro programátora. Pokud ji člověk potřebuje, tak si do metody strčí ono triger_error. Pokud ne, napíšu si do komentáře, že je abstraktní, a dál to neřeším...
llook
Profil
mila
O slovo abstract opravdu nejde (nakonec virtual v některých jazycích poslouží stejně dobře).

Jde o to, že neimplementovaná abstraktní metoda je zdrojem chyby už při definici třídy. Tohle žádnou chybu nevyhodí:
class Base {

function a() { trigger_error('I\'m abstract', E_USER_ERROR); }
}
class Child extends Base {}
Zatímco tohle chybu vyhodí:
abstract class Base {

public abstract function a();
}
class Child extends Base {}
medden
Profil *
WanTo
Povedal by som, že by ti to vyhodilo Fatal error: undefined function udelejNeco(), ale to len na okraj.

Ak by si tam mal $this->udelejNeco(), tak ti to skutočne "aaa" vypíše. Ale ak by si tam mal self::udelejNeco(), tak nie, pretože pri self:: je volaná rodičovská funkcia, čo je dosti nepríjemné (ale niekedy sa s tým dajú robiť pekné fígle - hlavne pri prístupe k premenným triedy). V PHP6 by mala prísť možnosť volať ako static::udelejNeco(), čo by "aaa" vypísalo, teda zo Syna.
thingwath
Profil
Ze syna. Bez toho by OOP přišlo o polovinu svých výhod.

Třeba v C++ metody nejsou samy o sobě virtuální, tedy kdybych udělal

Rodič r = new Syn ();
r.metoda ();

zavolá se ta z rodiče. Nicméně v dynamicky typovaném jazyku jako je PHP by to asi nedávalo moc smysl :-)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0