We hebben gewone classes, maar we hebben ook abstracte classes. Hierin staan concrete implementaties, maar wordt soms ook afgedwongen dat afgeleide classes bepaalde functionaliteit zelf implementeren.
Een abstracte class kan niet worden geïnstantieerd. Je kunt deze eigenlijk alleen maar uitbreiden door deze te extenden. In principe kan een abstracte class worden gezien als een hybride variant van een interface.
Bij een abstracte class is het mogelijk om gedeelde functionaliteit te definiëren. Dit kunnen functies zijn met een complete implementatie. Daarnaast kan een abstracte class ook bepaalde functionaliteit afdwingen.
<?php
abstract class Medewerker {
public $uurloon = 10;
public $aantal_uren = 40;
public function weekloon() {
return $this->uurloon * $this->aantal_uren;
}
abstract public function taken();
}
Om een class abstract te maken, gebruiken we het woord abstract
. We kunnen deze class niet meer instantiëren. In deze abstracte class dwingen we tevens af dat elke class die deze class uitbreidt (extend) een publieke methode taken
moet bevatten.
Abstracte class gebruiken (extenden)
In de uitleg over classes is al kort verteld hoe je een bestaande class kunt uitbreiden. In principe werkt dit hetzelfde voor een abstracte class.
<?php
class SeniorMedewerker extends Medewerker {
public function taken() {
return array(
'Aanwezig zijn',
'Leiding geven',
);
}
}
Toepassingen van abstracte classes
Abstracte classes zijn ideaal voor situaties waarin je gedeelde functionaliteit wilt definiëren, maar ook specifieke implementaties wilt afdwingen in subklassen. Denk aan een applicatie met verschillende soorten voertuigen (auto, fiets, vrachtwagen) waarbij elk voertuig een andere implementatie heeft voor de methode beweeg()
.
Verschil tussen abstracte classes en interfaces
Het belangrijkste verschil tussen abstracte classes en interfaces is dat abstracte classes zowel volledig geïmplementeerde methoden als abstracte methoden kunnen bevatten, terwijl interfaces alleen abstracte methoden definiëren. Abstracte classes worden gebruikt voor gedeelde functionaliteit en interfaces voor contracten die meerdere classes kunnen implementeren.
Voorbeeld met meerdere abstracte methoden
In het onderstaande voorbeeld definieert de abstracte class Dier
twee abstracte methoden (maakGeluid
en beweeg
). De class Hond
implementeert beide methoden.
<?php
abstract class Dier {
abstract public function maakGeluid();
abstract public function beweeg();
}
class Hond extends Dier {
public function maakGeluid() {
return "Blaff!";
}
public function beweeg() {
return "Rennen!";
}
}
?>
Overerving en abstracte classes
Subklassen die door overerving een abstracte class uitbreiden, kunnen gebruikmaken van de parent
-keyword om methoden uit de parent-class aan te roepen.
<?php
abstract class Medewerker {
public $uurloon = 10;
public $aantal_uren = 40;
public function weekloon() {
return $this->uurloon * $this->aantal_uren;
}
abstract public function taken();
}
class JuniorMedewerker extends Medewerker {
public function taken() {
return array(
'Aanwezig zijn',
'Assisteren',
);
}
public function weekloon() {
return parent::weekloon() + 50; // Bonus toevoegen aan weekloon
}
}
?>