Interfaces i OOP i PHP
Som du allerede ved, repræsenterer abstrakte klasser et sæt metoder til deres efterkommere. En del af disse metoder kan være implementeret i selve klassen, og en del metoder kan erklæres abstrakte og kræve implementering i underordnede klasser.
Forestil dig en situation, hvor din abstrakte klasse kun repræsenterer et sæt af abstrakte offentlige metoder, uden at tilføje metoder med implementering.
Faktisk beskriver din forældreklasse interface for efterkommere, det vil sige et sæt af deres offentlige metoder, der er obligatoriske at implementere.
Hvorfor har vi brug for dette: for at lave færre fejl ved programmering - ved at beskrive alle de nødvendige metoder i forældreklassen, kan vi være sikre på, at alle efterkommere faktisk implementerer dem.
Hvornår hjælper det: lad os sige, at vi opretter vores forældreklasse og flere efterkommere til den. Hvis vi senere, for eksempel, om en måned, beslutter at oprette endnu en efterkommer, vil vi helt sikkert glemme detaljerne i vores kode, og vi kan glemme at skrive implementeringen af en eller anden metode i den nye efterkommer. Men selve PHP vil ikke tillade, at metoden går tabt - og vil blot give en fejl.
Det samme gælder for en anden programmør, der arbejder med dit projekt. Lad os sige, at koden for forældreklassen blev skrevet af dig, og derefter besluttede din kollega at oprette endnu en efterkommer. Din kollega vil heller ikke kunne miste et par metoder.
Der er dog et problem: faktisk lavede vi vores forældreklasse for at skrive abstrakte offentlige metoder i den, men vi selv eller vores kollega har mulighed for ved et uheld at tilføje en ikke-offentlig metode eller en ikke-abstrakt metode til denne klasse.
Lad os sige, at vi fysisk vil forbyde at lave andre metoder i forælderen, ud over abstrakte offentlige. I PHP kan man til dette, i stedet for abstrakte klasser, bruge interfaces.
Interfaces repræsenterer klasser, hvor alle metoder er offentlige og uden implementering. Koden til metoderne skal implementeres af klasser, der implementerer interfacet.
Interfaces erklæres på samme måde som almindelige
klasser, men ved at bruge nøgleordet interface
i stedet for ordet class.
For arv fra interfaces bruges
en lidt anden terminologi: man siger, at
klasser ikke arver fra interfaces, men implementerer
dem. Derfor skal nøgleordet
implements bruges i stedet for ordet extends.
Man kan ikke oprette et objekt af et interface. Alle metoder
i et interface skal erklæres som public
og skal ikke have en implementering. Et interface
kan kun have metoder, ikke egenskaber.
Man kan heller ikke lave et interface og en klasse med
det samme navn.