Grensesnitt i OOP i PHP
Som du allerede vet, representerer abstrakte klasser et sett med metoder for sine etterkommere. En del av disse metodene kan være implementert i selve klassen, mens en del metoder kan være deklarert abstrakte og kreve implementering i barneklasser.
La oss forestille oss en situasjon hvor din abstrakte klasse kun representerer et sett med abstrakte publike metoder, uten å legge til metoder med implementering.
Faktisk beskriver din foreldreklasse grensesnittet til etterkommerne, det vil si settet av deres offentlige metoder, som er obligatoriske å implementere.
Hvorfor trenger vi dette: for å gjøre færre feil når vi programmerer - ved å beskrive alle nødvendige metoder i foreldreklassen, kan vi være sikre på at alle etterkommere faktisk implementerer dem.
Når dette hjelper: la oss si vi oppretter vår foreldreklasse og flere etterkommere til den. Hvis vi etter en tid, for eksempel, en måned senere, bestemmer oss for å opprette en ny etterkommer, vil vi sannsynligvis ha glemt detaljene i koden vår, og vi kan glemme å skrive implementeringen av en metode i den nye etterkommeren. Men selve PHP vil ikke tillate at metoden forsvinner - og vil rett og slett gi en feilmelding.
Det samme gjelder for en annen programmerer som arbeider med prosjektet ditt. La oss si koden til foreldreklassen ble skrevet av deg, og deretter bestemmer din kollega seg for å opprette enda en etterkommer. Din kollega vil heller ikke kunne miste et par metoder.
Det er imidlertid et problem: faktisk lagde vi vår foreldreklasse for å skrive abstrakte offentlige metoder i den, men vi selv eller vår kollega har muligheten til ved et uhell å legge til en ikke-offentlig metode i denne klassen eller en ikke-abstrakt en.
La oss si vi fysisk vil forby å lage andre metoder i forelderen, bortsett fra abstrakte offentlige. I PHP kan vi for dette, i stedet for abstrakte klasser, bruke grensesnitt.
Grensesnitt representerer klasser der alle metodene er offentlige og uten implementering. Koden til metodene må implementeres av klasser som etterfølger grensesnittene.
Grensesnitt deklareres på samme måte som vanlige
klasser, men ved å bruke nøkkelordet interface
i stedet for ordet class.
For arv fra grensesnitt brukes
et litt annet terminologi: man sier at
klasser ikke arver fra grensesnitt, men implementerer
dem. Følgelig, i stedet for ordet extends,
skal man bruke nøkkelordet
implements.
Man kan ikke opprette et objekt av et grensesnitt. Alle metoder
i et grensesnitt må deklareres som public
og skal ikke ha implementering. Et grensesnitt
kan kun ha metoder, ikke egenskaper.
Man kan heller ikke lage et grensesnitt og en klasse med
samme navn.