PHP Objecten

Met de aanmaak van klassen en objecten kan je de code overzichtelijk houden omdat er 'centrale plekken' zijn waar je alle data over een object bewaard. In plaats van dat je dus overal functies en data hebt rondzwerven weet je gelijk waar je moet zijn als er iets veranderd moet worden. Dat kan jou en je mede-programmeurs veel tijd besparen.

Het verdient aanbeveling om bijvoorbeeld een lib directory te maken en daar je objectcode in te plaatsen. Een php-bestand met classes kan je dan bijvoorbeeld oop_lib.php noemen.

Objecten terminologie

Bij PHP objecten gebruik je classes, objects, properties en methods. Wat betekent dat nu precies?

Class of Klasse Technische definitie/omschrijving van een object.
Property of Eigenschap Vergelijkbaar met een constante of een variabele (in procedureel PHP).
Method of Methode Bijna hetzelfde als een PHP functie in procedureel PHP.

Aanmaak van een klasse

<?php
class persoon {
...
}

Voeg data toe aan je klasse

<?php
class persoon {
    //Een variabele of constante in je klasse heet dus een eigenschap of 'property'.
    //Een variabele is standaard altijd 'public'.
    var $name;
}

Voeg functies toe aan je klasse

<?php
class persoon {
    var $naam;

    function set_naam($nieuwe_naam) {
        $this->naam = $nieuwe_naam; //let hier op 'naam' zonder '$'!
    }

    function get_naam {
        return $this->naam;
    }
}

De $this variabele

De $this variable is ingebouwd in php en verwijst altijd naar de huidige klasse. Je gebruikt $this om methodes en eigenschappen van de klasse te gebruiken (zie hierboven).

Getters en setters

In bovenstaand voorbeeld zie je twee methodes met set_ en get_ ervoor. Het is nu ook voor andere programmeurs duidelijk dat er een eigenschap naam is in de klasse waar wat mee gebeurd.

<?php
    //Gebruik een setter
    $caspar->set_naam("Caspar Diesch");
?>
<?php
    //Gebruik nu een getter om de naam op te vragen
    echo 'Caspar zijn volledige naam is: '.$caspar->get_naam();
?>

Direct gebruiken van eigenschappen/properties is NOT DONE! Gebruik daarvoor getters en setters. Dus niet:

<?php
     echo 'Caspar zijn volledige naam is: '.$caspar->naam(); //niet doen dus
?>

Een object maken

<?php
    //Neem eerst de klasse op in de code (er is nu dus nog geen object gemaakt!)
    include ("classlib.php");

    //En maak nu het object aan
    $caspar = new persoon();
?>

Constructors

Met het gebruik van __construct in je klasse kan je voorkomen dat je methodes moet aanroepen dus krijg je minder code. En minder code is minder kans op fouten.

Een constructor wordt automatisch aangeroepen als je met new een nieuw object van een klasse maakt. De constructor moet buiten de klasse bereikbaar zijn, gebruik daarom public bij de constructor.

public function __construct($persoon_naam) {
    $this->naam = $persoon_naam;
}

Nu bij het maken van het object kan je gelijk iets doorgeven, zonder daarvoor de setter te gebruiken.

<?php
    $caspar = new persoon('Caspar Diesch');
?>

Access modifiers: public, private en protected

Je kan de toegang tot variabelen en functies binnen en klasse regelen als volgt:

<?php
class persoon {
    var $naam;
    public $lengte;
    protected $verzekerings_nummer;
    private burger_service_nummer;
}
var $naam Zet je niks voor een variabele/methodes dan zal deze automatisch public worden. Iedereen kan dus de inhoud van deze variabele opvragen.
public $lengte Hiermee geef je aan dat de inhoud van deze variabele of deze methode voor iedereen toegankelijk is.
protected $verzekerings_nummer De klasse waar de variabele/methode in staat en eventuele subklassen kunnen hier gebruik van maken.
private burger_service_nummer Alleen de klasse waar de variabele/methode in staat kan hiervan gebruik maken. En dus niet eventuele subklassen. Dit is dus de zwaarst beveiligde access modifier.

Inheritance: gebruik je klasse als basis voor andere klasses.

Okay, dit is misschien een wat lastig onderdeel. Maar toch moet het even behandeld worden. Je kan namelijk een klasse gebruiken als basis voor een nieuwe klasse. Dit zorgt er op zijn beurt ook weer voor dat code maar een keertje hoeft te worden ingetypt want het wordt gecentraliseerd.

Begin de klasse altijd met een hoofdletter.

Laten we eens beginnen met de klasses Persoon en Werknemer:

Klasses
  • Persoon
    • Naam
    • Adres
    • Woonplaats
  • Werknemer
    • Afdeling
    • Machine
    • Naam
    • Adres
    • Woonplaats

Een Werknemer is natuurlijk ook een Persoon dus ik wil dat de eigenschappen van Persoon worden overgenomen. Je zou verwachten dat je dan Werknemer 'onder' persoon gaat hangen maar in PHP is dit net omgekeerd. Persoon wordt dan de parent klasse genoemd.

Klasses
  • Werknemer class Werknemer extends Persoon {...}
    • Afdeling
    • Machine
    • Persoon parent klasse
      • Naam
      • Adres
      • Woonplaats
//En hier het bovenstaande in php code
// Klasse Werknemer 'erft' alle eigenschappen van 'Persoon'

class Werknemer extends Persoon {
    
    //En we 'erven' hier dus alle methodes van Persoon
    ...
 }

... Binnenkort hier meer