Gyakori, hogy szeretnél olyan osztályokat kialakítani, amelyek egy már meglévő osztályhoz hasonló tulajdonságokkal és metódusokkal rendelkeznek. Tulajdonképpen jó gyakorlat egy általános osztályt definiálni, amit minden projektedben használhatsz, és ezt az osztályt alakítani az egyes projektek igényeinek megfelelően. Ennek a megvalósítása érdekében az osztályok lehetnek más osztályok kiterjesztései. A kiterjesztett, vagy származtatott osztály minden tulajdonággal és metódussal rendelkezik, ami a kiindulási osztályban megvolt (ezt nevezzük öröklésnek, bár senki sem hal meg a folyamat során). Amit hozzáadsz a kiindulási osztályhoz, azt nevezzük kiterjesztésnek. Nem lehetséges megcsonkítani egy osztályt, azaz megszüntetni egy metódust, vagy tulajdonságot. Egy leszármazott osztály mindig pontosan egy alaposztálytól függ, azaz egyidejűéleg többszörös leszármaztatás nem támogatott. A kiterjesztés kulcsszava az 'extends'.
class Gazdas_Kosar extends Kosar { var $tulaj; function tulajdonosa ($nev) { $this->tulaj = $nev; } } |
Ez definiál egy Gazdas_Kosar nevű osztályt, ami a Kosar összes változójával és metódusával rendelkezik, és van egy saját változója, a $tulaj, no meg egy saját metódusa, a tulajdonosa(). A gazdás kosarat a hagyományos módon hozhatod létre, és a kosár tulajdonosát is be tudod állítani, le tudod kérdezni [ebben az esetben favágó módszerrel]. A gazdás kosarakon továbbra is lehet használni a Kosar függvényeit:
$gkosar = new Gazdas_Kosar; // Gazdás kosár létrehozása $gkosar->tulajdonosa ("Namilesz Teosztasz"); // a tulaj beállítása print $gkosar->tulaj; // a tulajdonos neve $gkosar->break ("10", 1); // (Kosar-ból öröklött funkcionalitás) |
Ezt "szülő-gyermek" kapcsolatnak is hívják. Egy osztály akkor válik szülőosztállyá, ha más osztály létrehozásakor ezt veszik alapul az extends kulcsszó használatával. Ezzel a kiterjesztéssel definiált osztályt hívjuk gyermek-osztálynak -- ebben a kapcsolatban. Ugyanis ezek után ez a gyermekosztály is lehet más osztályok szülőosztálya, ha belőle is származtatnak egy osztályt.
Megjegyzés: Az osztálydefinicióknak a további felhasználásuk előtt rendelkezésre kell állniuk! Ha a Gazdas_Kosar-ra van szükség a Kosar kiterjesztéseként, akkor előbb a Kosar osztályt kell definiálni. Ha egy újabb osztályt származtatunk Sarga_Gazdas_Kosar néven a Gazdas_Kosar osztályból, akkor a Gazdas_Kosar osztálydefiniciónak előbb kell szerepelnie. Röviden, az osztálydefiniciók sorrendje nagyon fontos. Az osztálydefiníciókat hierarchia legfelső szintjén álló osztállyal kell kezdeni, azzal, amelyik minden más osztálynak az ősének számít (szülő vagy nagy-, déd-, ük-, szépszülő).