PHP Tutorial.nl

Word een PHP expert!!!

Home » Classes: maak zelf objecten met een eigen verantwoordelijkheid

Classes: maak zelf objecten met een eigen verantwoordelijkheid

Na functies is het een kleine stap naar een class (klasse). Een class is namelijk een verzameling van functies. Dit klinkt misschien vrij abstract en vrijblijvend. En nee, een class hoort niet 30 willekeurige functies te bevatten. Om het minder abstract te maken: een class heeft samenhang.

Stel nu dat we een ‘Medewerker’ hebben. Dit is iets met bepaalde eigenschappen zoals: uurloon en aantal uren. Voor deze medewerker kunnen we bepalen hoeveel hij kost voor x aantal uren. Dit laatste is een ‘functie’. In de context van een class noemen we dit een methode.

<?php
class Medewerker {
    public $uurloon = 10;
    public $aantal_uren = 40;
   
    public function weekloon() {
       return $this->uurloon * $this->aantal_uren;
    }
}

Dit lijkt vrij veel op de functie die eerder beschreven is. We hebben een class, met daar achter de naam van de class: Medewerker. De inhoud van deze class staat tussen de { en }.

We zien vervolgens twee dingen: ‘variabelen’ en ‘functies’. De variabelen zijn in dit geval attributen (properties) en de functies worden methodes (methods) genoemd.

Iets anders wat opvalt is de variabele $this. Deze variabele is een verwijzing naar de class zelf. Door middel van $this is het mogelijk om attributen en methodes binnen de class zelf aan te roepen.

Daarnaast hebben we ‘public‘. Dit geeft de zichtbaarheid van een attribuut of methode aan. Andere opties zijn protected en private. Hierover verderop meer uitleg.

Class instantiëren

Het hebben van een class is leuk, maar we kunnen er niet nog iets mee. We moeten het eerst instantiëren en dan kunnen we de publieke functionaliteit ervan aanroepen. Als een class eenmaal is geïnstantieerd dan noemen we deze instantie ook wel het object.

<?php
$medewerker = new Medewerker();
echo $medewerker->weekloon();
?>

Uitbreiden (extenden) van een class

Soms wil je functionaliteit van een class uitbreiden, zonder daarvoor een groot deel van de definitie te dupliceren. Dit heet Inheritance. 

Het is uitbreiden oftewel extenden heeft wel een limiet. Elke class mag slechts één andere class (of abstracte class) uitbreiden. Wel mag de class die uitgebreid wordt zelf ook weer een class extenden. Let wel op: te diepgaande inheritance kan onoverzichtelijk worden; waar komt nu methode x precies vandaan?

Stel we hebben een variant op de Medewerker: Senior Medewerker. Deze werkt ook 40 uur en heeft hetzelfde uurloon, maar hij krijgt wel een bonus van 50 euro per week.

<?php
class SeniorMedewerker extends Medewerker {

    public function weekloon() {
       $weekloon = parent::weekloon();
       return $weekloon + 50;
    }
}

In het voorbeeld hierboven maken we een nieuwe class aan: SeniorMedewerker. Deze extends de Medewerker. Hij pakt dus alles wat in de class Medewerker zit en breid vervolgens de class uit.

We roepen in dit geval de parent::weekloon() methode aan. De parent is hier dus Medewerker. Het resultaat daarvan tellen we op bij de 50 euro die een Senior Medewerker extra krijgt. We maken hierbij gebruik van Overerving.

Bij overerving pakken we het resultaat van de parent en die gebruiken we om iets extra’s mee te doen. We kunnen ook een eigen implementatie van weekloon schrijven, zonder te kijken naar de parent. We overschrijven in dat geval dus de parent. Dat principe heet Overriding.


Visibility, oftewel zichtbaarheid

Het is mogelijk om invloed uit te oefenen op de attributen en methodes. Over het algemeen zal er meestal gekozen worden voor public functionaliteit. Deze functionaliteit is benaderbaar binnen en buiten de class instantie. Alternatieven zijn protected en private

Door een attribuut of methode protected te maken zorg je ervoor dat deze alleen bij de class zelf en bij de class die erft (inherit) beschikbaar is. 

Een private attribuut of methode is alleen toegankelijk voor de class zelf en dus niet daarbuiten.

Het return type: wat geeft een methode terug

In de recentere PHP-versies is het mogelijk om aan te geven wat voor type een methode precies teruggeeft. Zo weet je als ontwikkelaar wat je kan verwachten bij de implementatie van classes en hoef je geen conversies meer te doen. Het return type kan een van de datatypes zijn uit PHP zelf of bijvoorbeeld een class die je zelf hebt geschreven.

<?php
class SeniorMedewerker extends Medewerker {

    public function weekloon(): int {
       $weekloon = parent::weekloon();
       return $weekloon + 50;
    }
}

In het bovenstaande voorbeeld geven we met :int aan, dat er een integer wordt teruggeven. Geeft je methode niets terug, dan is er sprake van een void en ook dat kunnen we in de code aangeven.

<?php
class SeniorMedewerker extends Medewerker {

    public function voorstellen(): void {
       echo 'Ik ben Andy';
    }
}

En je hebt ook de mogelijkheid om een combinatie zowel een null als een specifiek type terug te geven.

<?php
class SeniorMedewerker extends Medewerker {
    private bool $isOntslagen = false;

    public function verantwoordelijkheden(): ?string {
       if ( $this->isOntslagen === true ) {
          return null;
       } 

       return 'Geeft sturing';
    }
}