Dedovanje je pomemben del objektnega programiranja. Z njim lahko nov razred zgradi na že obstoječem razredu in prevzame njegove lastnosti ter metode.
Pomni: Pri dedovanju je obstoječi razred starševski razred, novi razred pa otroški razred. Otrok nastane z uporabo besede extends.
Kaj je dedovanje
Če razred razširi drug razred, otrok deduje vse javne in zaščitene lastnosti, metode in konstante starševskega razreda, razen če določene metode prepiše s svojo različico. Zasebni člani starševskega razreda niso neposredno dostopni v otroškem razredu.
Osnovni primer dedovanja
<?php
class Vozilo
{
public $znamka = "Audi";
public function izpisiZnamko()
{
echo "Znamka: " . $this->znamka;
}
}
class Avto extends Vozilo
{
}
$avto = new Avto();
$avto->izpisiZnamko();
?>
Pomni: Če otrok ne prepiše metode starša, uporabi podedovano različico metode.
Prepis metode
Otrok lahko podedovano metodo tudi prepiše in določi svoje obnašanje.
<?php
class Vozilo
{
public function izpis()
{
echo "To je vozilo.";
}
}
class Avto extends Vozilo
{
public function izpis()
{
echo "To je avto.";
}
}
$avto = new Avto();
$avto->izpis();
?>
V tem primeru se pri objektu razreda Avto izvede otrokova metoda, ne pa starševska.
Uporaba parent::
Če želimo v otroškem razredu poleg svoje kode uporabiti tudi kodo iz starševskega razreda, uporabimo parent::.
<?php
class Vozilo
{
public function izpis()
{
echo "To je vozilo.<br>";
}
}
class Avto extends Vozilo
{
public function izpis()
{
parent::izpis();
echo "To je avto.";
}
}
$avto = new Avto();
$avto->izpis();
?>
Pomni: Z zapisom parent::imeMetode() v otroškem razredu pokličemo metodo starševskega razreda.
Vidnost pri dedovanju
Otrok deduje javne in zaščitene člane, zasebnih pa ne more neposredno uporabljati. Vidnost lahko pri prepisu metode sprostimo, na primer iz protected v public, ne smemo pa je zaostriti. PHP pri tem posebej omenja, da so konstruktorji izjema, kjer je vidnost lahko tudi bolj omejena.
Pozor: Lastnost ali metoda z vidnostjo private v starševskem razredu ni neposredno dostopna v otroškem razredu.
Vrstni red razredov
Starševski razred mora biti definiran pred otroškim razredom, razen če uporabljamo samodejno nalaganje razredov.
Pozor: Če starševski razred ni definiran pravočasno, otrok ne more pravilno razširiti tega razreda.
Pogoste napake
- napačno prepričanje, da otrok deduje tudi zasebne lastnosti starševskega razreda,
- izpuščanje uporabe ključne besede
extends, - prepisovanje metode brez razumevanja, da se s tem nadomesti starševska različica,
- nepoznavanje uporabe
parent::, - zamenjevanje pojmov starševski in otroški razred.