Interfészek az OOP-ben PHP-ben
Ahogy már tudod, az absztrakt osztályok metódusok gyűjteményét jelentik az utódaik számára. Ezen metódusok egy része megvalósítható maga az osztályban, míg más metódusok absztraktként deklarálhatók és megvalósítást igényelnek a leszármazott osztályokban.
Képzeljük el a helyzetet, amikor az absztrakt osztályod csupán absztrakt publikus metódusok gyűjteménye, anélkül, hogy megvalósított metódusokat adna hozzá.
Lényegében a szülői osztályod leírja az utódok interfészét, azaz az ő kötelezően megvalósítandó publikus metódusaik gyűjteményét.
Miért van erre szükségünk: hogy kevesebb hibát kövessünk el a programozás során - leírva az összes szükséges metódust a szülő osztályban, biztosak lehetünk benne, hogy az összes utód valóban megvalósítja azokat.
Mikor segít ez: tegyük fel, hogy létrehozzuk a mi szülő osztályunkat és néhány utódot hozzá. Ha később, például egy hónap múlva, úgy döntünk, hogy még egy utódot hozunk létre, biztosan elfelejtjük a kódunk részleteit és könnyen előfordulhat, hogy elfelejtünk megvalósítani egy-két metódust az új utódban. Azonban maga a PHP nem engedi, hogy a metódus elveszjen - és egyszerűen hibát jelez.
Ugyanez vonatkozik egy másik programozóra is, aki a projekteden dolgozik. Tegyük fel, hogy te írtad a szülő osztály kódját, majd egy kollégád úgy dönt, hogy még egy utódot hoz létre. A kollégádnak sem sikerül "elveszítenie" pár metódust.
Van azonban egy probléma: lényegében azért hoztuk létre a szülő osztályunkat, hogy abstrakt publikus metódusokat írjunk bele, de nekünk vagy a kollégánknak megvan a lehetősége, hogy véletlenül nem publikus vagy nem absztrakt metódust adjon hozzá ehhez az osztályhoz.
Tegyük fel, hogy fizikailag meg akarjuk tiltani, hogy a szülőben más metódusokat lehessen csinálni, mint absztrakt publikusakat. A PHP-ben ehhez az absztrakt osztályok helyett interfészeket lehet használni.
Az interfészek olyan osztályok, amelyeknek minden metódusa publikus és nincs megvalósításuk. A metódusok kódját az interfészek leszármazott osztályainak kell megvalósítaniuk.
Az interfészek ugyanúgy deklarálhatók, mint a
szokásos osztályok, de a class
szó helyett a interface
kulcsszót használva.
Az interfészektől való örökléshez egy kicsit
más terminológiát használunk: azt mondják, hogy
az osztályok nem örökölnek az interfészektől,
hanem megvalósítják
azokat. Ennek megfelelően a extends
szó helyett a
implements kulcsszót
kell használni.
Nem lehet létrehozni egy interfész objektumát.
Az interfész összes metódusát public-ként
kell deklarálni, és nem lehet megvalósításuk.
Egy interfésznek csak metódusai lehetnek, nem
tulajdonságai. Nem lehet interfészt és osztályt
egyazon névvel létrehozni sem.