Liidesed OOP-s PHP-s
Nagu te juba teate, esindavad abstraktsed klassid oma järglaste jaoks meetodite kogumi. Osa neist meetoditest võib olla realiseeritud juba klassis endas, ja osa meetodeid võib olla deklareeritud abstraktsetena ja nõuda realiseerimist alamklassides.
Kujutagem ette olukorda, kus teie abstraktne klass on ainult abstraktsete avalike meetodite kogum, ilma et lisaks realiseeritud meetodeid.
Tegelikult kirjeldab teie vanemaklass liidest oma järglastele, see tähendab nende avalike meetodite kogumit, mis on kohustuslikud realiseerimiseks.
Miks me seda vajame: selleks, et programmeerimisel teha vähem vigu - kirjeldades kõik vajalikud meetodid vanemklassis, võime olla kindlad, et kõik alamklassid realiseerivad need tõesti.
Millal see aitab: oletame, et loome oma vanemklassi ja mitu selle alamklassi. Kui mõne aja pärast, näiteks kuu aja pärast, otsustame luua veel ühe alamklassi, siis kindlasti unustame me oma koodi detailid ja võime kergesti unustada kirjutada mõne meetodi realiseerimise uues alamklassis. Kuid PHP ise ei lase meetodit kaotsi minna - ja annab lihtsalt veateate.
Sama kehtib ka teise programmeerija kohta, kes teie projektiga töötab. Oletame, et vanemklassi koodi kirjutasite teie ja siis teie kolleeg otsustas luua veel ühe alamklassi. Ka teie kolleegil ei õnnestu paar meetodit kaotsi lasta.
On siiski probleem: tegelikult tegime me oma vanemklassi selleks, et kirjutada sinna abstraktseid avalikke meetodeid, kuid meie ise või meie kolleeg omavad võimalust kogemata lisada sellesse klassi mitte avalikku meetodit või mitte abstraktset meetodit.
Oletame, et tahame füüsiliselt keelata teha vanemklassis muid meetodeid peale abstraktsete avalike. PHP-s saab selleks abstraktsete klasside asemel kasutada liideseid.
Liidesed on klassid, mille kõik meetodid on avalikud ja ilma realiseeringuta. Meetodite kood peavad realiseerima liideste alamklassid.
Liidesed deklareeritakse samamoodi nagu tavalised
klassid, kuid kasutades võtmesõna interface
sõna class asemel.
Liidestest pärimiseks kasutatakse
veidi teist terminoloogiat: öeldakse, et
klassid ei päri liidestest, vaid realiseerivad
neid. Seega võtmesõna extends asemel
tuleks kasutada võtmesõna
implements.
Liidese objekti ei saa luua. Kõik liidese
meetodid peavad olema deklareeritud kui public
ja neil ei tohi olla realiseeringut. Liidesel
võivad olla ainult meetodid, mitte omadused.
Samuti ei saa teha liidest ja klassi
sama nimega.