Skip to main content

OOP

1 Wat is OOP en waarom gebruiken we het?

🎯 Leerdoelen

  • Je begrijpt het verschil tussen procedureel programmeren en OOP.
  • Je weet wat een class, object en method zijn.
  • Je kunt herkennen wanneer OOP handig is in grotere projecten.

💡 Uitleg

Wat is OOP?

OOP staat voor Objectgeoriënteerd programmeren (object geörienteerd programmeren). In plaats van losse functies en variabelen, werk je met objecten die gedrag (via classes) en gegevens (properties) combineren.

Waarom OOP gebruiken?

  • Je kunt code beter organiseren en hergebruiken.
  • Je maakt je programma makkelijker uitbreidbaar.
  • Je kunt complexe systemen opdelen in logische blokken (objecten).

Voorbeeld: procedureel vs OOP

Procedureel:

<?php
$naam = "Tessa";
$leeftijd = 19;

function begroet($naam) {
    echo "Hallo, ik ben " . $naam;
}

begroet($naam);
?>

Objectgeoriënteerd:

<?php
class Persoon {
    public $naam;
    public $leeftijd;

    public function begroet() {
        echo "Hallo, ik ben " . $this->naam;
    }
}

$tessa = new Persoon();
$tessa->naam = "Tessa";
$tessa->leeftijd = 19;
$tessa->begroet();
?>

👉 Je ziet hier dat de fucntie en de variabelen in één blok (class) staan.

We gebruiken bij OOP soms vreemde termen:

Procedureel OOP
variabele property (van een class)
functie method

🛠️ Opdracht – Van procedureel naar objectgeoriënteerd

Je gaat een simpel PHP-script omzetten naar OOP.

  1. Maak een bestand mijn-procedureel.php en schrijf de volgende code:
    <?php
    $autoMerk = "Toyota";
    $bouwjaar = 2018;
    
    function toonAuto($merk, $jaar) {
        echo "Dit is een $merk uit $jaar";
    }
    
    toonAuto($autoMerk, $bouwjaar);
    ?>
  2. Maak nu een tweede bestand: mijn-oop.php en herschrijf dit script in OOP-stijl:
    <?php
    class Auto {
        ...
        ...
        ...
        ...
    }
    
    $auto = new Auto();
    $auto->merk = "Toyota";
    $auto->bouwjaar = 2018;
    $auto->toon();
    ?>

🧠 Reflectie

  • Wat vond je makkelijker: de procedurele of de OOP-versie?
  • Waarom denk je dat OOP belangrijk is bij grotere projecten?

📤 Inleveren

  • Lever beide bestanden in: mijn-procedureel.php en mijn-oop.php
  • Maak een kort reflectiebestand: reflectie-les1-<jouw-naam>.txt
  • Let op: je code moet uitvoerbaar zijn in de browser (via XAMPP of localhost).

2 Klassen en objecten

🎯 Leerdoelen

  • Je weet wat een class en een object zijn.
  • Je kunt een eenvoudige klasse maken in PHP.
  • Je kunt een object aanmaken op basis van die klasse en ermee werken.

💡 Uitleg

Wat is een class?

Een klasse is een soort blauwdruk of bouwtekening. Je beschrijft hiermee hoe een bepaald type object eruitziet en wat het kan doen.

Wat is een object?

Een object is een concreet exemplaar van een klasse. Je maakt een object aan met new. Een klasse kun je meerdere keren gebruiken om verschillende objecten te maken.

Class, Object, Properties en Methods worden nog een keer duidelijk gemaakt in:

https://slides.com/jamescandan/oop-php-for-beginners-1-2/fullscreen#/5

Dus een class is een sjabloon van een object en met het commando new <class_naam> maken we een nieuw object van de sjabloon. In een class heten de variabelen properrties en de fucnties heten methods.

Voorbeeld:

<?php
class Hond {
    public $naam;
    public $leeftijd;

    public function blaf() {
        echo "Woef! Ik ben " . $this->naam;
    }
}

$mijnHond = new Hond();
$mijnHond->naam = "Rex";
$mijnHond->leeftijd = 3;
$mijnHond->blaf();

$jouwHond = new Hond();
$jouwHond->naam = "Sip";
$jouwHond->leeftijd = 5;
$jouwHond->blaf();
?>

👉Je hebt één class, maar je hebt twee objecten (honden) van deze class: $mijnHond en $jouwHond

🛠️ Opdracht – Maak je eigen klasse

  1. Maak een nieuw bestand: mijn-klas.php
  2. Maak hierin een class Student met de eigenschappen voornaam, achternaam en opleiding.
  3. Maak een methode stelVoor() die zegt: "Hallo, ik ben [voornaam] [achternaam] en ik doe de opleiding [opleiding]."
  4. Maak drie objecten ($student01, $student02, en $student03) van de class en test het resultaat in je browser.

🧠 Reflectie

  • Wat viel je op bij het maken van een object?
  • Wat gebeurt er als je een properties (voornaam, achternaam en opleiding) niet vult voor je stelVoor() gebruikt?

📤 Inleveren

  • Bestandsnaam: mijn-klas.php
  • Reflectievragen in een apart txt- of PDF-bestand.

3 Constructors en eigenschappen

🎯 Leerdoelen

  • Je weet wat een constructor is in een klasse.
  • Je kunt automatisch waarden toekennen bij het maken van een object.
  • Je begrijpt het verschil tussen eigenschappen (properties) en methoden.

💡 Uitleg

Wat is een constructor?

Een constructor is een speciale methode die automatisch wordt uitgevoerd als je een object maakt. In PHP heet deze methode __construct().

Waarom handig?

Met een constructor hoef je niet handmatig eigenschappen toe te wijzen nadat je een object hebt aangemaakt.

Voorbeeld zonder constructor:

<?php
class Auto {
    public $merk;
    public $bouwjaar;
}

$auto = new Auto();
$auto->merk = "Toyota";
$auto->bouwjaar = 2018;
?>

Voorbeeld met constructor:

<?php
class Auto {
    public $merk;
    public $bouwjaar;

    public function __construct($merk, $bouwjaar) {
        $this->merk = $merk;
        $this->bouwjaar = $bouwjaar;
    }
}

$auto = new Auto("Toyota", 2018);
?>

🛠️ Opdracht – Constructor gebruiken

  1. Maak een nieuw bestand: les3-student.php
  2. Maak opnieuw een klasse Student met eigenschappen: voornaam, achternaam en opleiding.
  3. Voeg een constructor toe waarin deze waarden worden ingesteld.
  4. Maak een methode stelVoor() die de gegevens netjes toont.
  5. Maak minstens twee objecten aan en laat de stelVoor()-methode zien in de browser.

🧠 Reflectie

  • Wat is het voordeel van een constructor ten opzichte van handmatige toekenning?
  • Wat gebeurt er als je het aantal parameters niet goed doorgeeft?
  • Wat betekent $this->... in de constructor?

📤 Inleveren

  • Bestandsnaam: les3-student.php
  • Reflectievragen in een apart bestand: reflectie-les3-<jouw-naam>.txt

4 Methoden met parameters en returnwaardes

🎯 Leerdoelen

  • Je begrijpt hoe je een methode maakt die parameters accepteert.
  • Je kunt een methode schrijven die een waarde teruggeeft met return.
  • Je ziet hoe objectmethoden kunnen samenwerken met parameters uit de code.

💡 Uitleg

Wat is een parameter?

Een parameter is een waarde die je doorgeeft aan een methode, zodat deze methode die waarde kan gebruiken in de berekening of actie.

Wat is een returnwaarde?

Met return geef je een resultaat terug uit een methode, zodat je dat resultaat ergens anders kunt gebruiken.

Voorbeeld:

<?php
class Rekening {
    public $saldo;

    public function __construct() {
        $this-saldo = 0;
    }

    public function stort($bedrag) {
        // vul hier de code aan
    }

    public function toonSaldo() {
        // vul hier de code aan
    }
}

$mijnRekening = new Rekening();
$mijnRekening->stort(50);
echo "Je saldo is: ". $mijnRekening->toonSaldo();
?>

🛠️ Opdracht – Werk met parameters en return

  1. Maak een nieuw bestand: les4-rekening.php
  2. Maak een klasse Rekening met een startsaldo van 0.
  3. Voeg een methode stort($bedrag) toe die het bedrag bij het saldo optelt.
    💡Tip: vegeet niet $this-> te gebruiken!
  4. Voeg een methode opname($bedrag) toe die het bedrag van het saldo afhaalt.
  5. Voeg een methode toonSaldo() toe die het saldo teruggeeft met return.
  6. Test de klasse met een paar stortingen en paar opnames. Toon telkens het saldo in de browser.

🧠 Reflectie

  • Wat gebeurt er als je een opname doet die groter is dan je saldo?
  • Waarom heeft de constructor in de class Rekening in het voorbeeld geen parameter (om het saldo op 0 te zetten)?
  • Wat zijn de voordelen van werken met return?

📤 Inleveren

  • Bestandsnaam: les4-rekening.php
  • Reflectievragen in een apart bestand: reflectie-les4-<jouw-naam>.txt

5 Encapsulation en private properties

🎯 Leerdoelen

  • Je weet wat encapsulation is.
  • Je begrijpt het verschil tussen public en private.
  • Je kunt getters en setters gebruiken om toegang tot eigenschappen te regelen.

💡 Uitleg

Encapsulation betekent dat je data (properties van een class) beschermt tegen direct aanpassen van buiten de class. In plaats daarvan gebruik je methods om de data op een gecontroleerde manier te bekijken of aan te passen.

Waarom gebruiken?

Zo voorkom je fouten doordat andere delen van je code zomaar eigenschappen aanpassen zonder controle.

Voorbeeld:

<?php
class Bankrekening {
    private $saldo = 0;

    public function stort($bedrag) {
        if ($bedrag > 0) {
            $this->saldo += $bedrag;
        }
    }

    public function getSaldo() {
        return $this->saldo;
    }
}

$rekening = new Bankrekening();
$rekening->stort(100);
echo "Saldo: ".$rekening->getSaldo();
?>

🛠️ Opdracht – Bescherm je data

  1. Maak een nieuw bestand: les5-bankrekening.php
  2. Maak een klasse Bankrekening met een private eigenschap $saldo.
  3. Maak een stort()-methode die alleen positief bedrag accepteert.
  4. Maak een getSaldo()-methode die het saldo teruggeeft.
  5. Test de klasse met verschillende stortingen en probeer ook een negatieve storting (die moet worden geweigerd).
  6. Maak nu een opnemen($bedrag) waarmee je geld kan opnemen. Zorg ervoor dat je alleen geld kan opnemen als je voldoende saldo hebt. Heb je dat niet, dan vind er geen opname plaats.
  7. Test de method opname($bedrag) uit!

🧠 Reflectie

  • Wat is het verschil tussen public en private?
  • Waarom zou je eigenschappen private maken?
  • Wat gebeurt er als je probeert $saldo direct aan te passen: $rekening->saldo = 1000;
    Wat zie je? En hoe verklaar je dat?

📤 Inleveren

  • Bestandsnaam: les5-bankrekening.php
  • Reflectievragen in pdf.

6 Klassen samenwerken: Bibliotheeksysteem

🎯 Leerdoelen

  • Je maakt en gebruikt meerdere klassen in één project.
  • Je begrijpt hoe objecten van verschillende klassen met elkaar communiceren.
  • Je oefent met private properties, getters/setters en method-parameters.
  • Je bouwt een klein functioneel systeem met relaties tussen objecten.

💡 Uitleg

In dit mini-project bouw je een eenvoudig bibliotheeksysteem. Je maakt drie klassen:

  1. Book: een boek met een titel, auteur en beschikbaarheidsstatus.
  2. Member: een lid met een naam en een lijst van geleende boeken.
  3. Library: beheert een collectie boeken en leden, en verwerkt uitleen- en retouracties.

🛠️ Opdracht – Bouw je eigen bibliotheek

1. les7-book.php

<?php
class Book {
    private string $title;
    private string $author;
    private bool $available;

    public function __construct(string $title, string $author) {
        $this->title     = $title;
        $this->author    = $author;
        $this->available = true;
    }

    public function getTitle(): string {
        return $this->title;
    }

    public function getAuthor(): string {
        return $this->author;
    }

    public function isAvailable(): bool {
        return $this->available;
    }

    public function setAvailable(bool $status): void {
        $this->available = $status;
    }

    // OPDRACHT: voeg __toString() toe
}
?>
Opdracht: voeg een methode toe public function __toString(): string die titel en auteur toont.

2. les7-member.php

<?php
require_once 'les7-book.php';

class Member {
    private string $name;
    /** @var Book[] */
    private array $borrowedBooks = [];

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function getName(): string {
        return $this->name;
    }

    public function borrowBook(Book $book): void {
        // OPDRACHT: zorg dat hetzelfde boek niet twee keer geleend kan worden
        $this->borrowedBooks[] = $book;
    }

    public function returnBook(Book $book): void {
        // OPDRACHT: haal het boek weg uit $borrowedBooks
    }

    public function listBorrowed(): string {
        if (empty($this->borrowedBooks)) {
            return $this->name . ' heeft geen boeken geleend.';
        }
        $titles = array_map(
            fn(Book $b) => $b->getTitle(),
            $this->borrowedBooks
        );
        return $this->name . ' heeft geleend: ' . implode(', ', $titles);
    }
}
?>
Opdracht: werk de methods borrowBook() en returnBook() uit.

3. les7-library.php

<?php
require_once 'les7-book.php';
require_once 'les7-member.php';

class Library {
    /** @var Book[] */
    private array $books   = [];
    /** @var Member[] */
    private array $members = [];

    public function addBook(Book $book): void {
        $this->books[] = $book;
    }

    public function addMember(Member $member): void {
        $this->members[] = $member;
    }

    public function lendBook(string $title, string $memberName): string {
        // OPDRACHT: vind en uitleenlogica implementeren
        return "…";
    }

    public function returnBook(string $title, string $memberName): string {
        // OPDRACHT: retourlogica implementeren
        return "…";
    }

    public function listBooks(): string {
        $lines = array_map(
            fn(Book $b) => $b->getTitle() . ' door ' . $b->getAuthor()
                . ' – ' . ($b->isAvailable() ? 'beschikbaar' : 'niet beschikbaar'),
            $this->books
        );
        return implode(PHP_EOL, $lines);
    }
}
?>
Opdracht: implementeer de methods lendBook() en returnBook().

4. les7-test.php

<?php
require_once 'les7-book.php';
require_once 'les7-member.php';
require_once 'les7-library.php';

$lib = new Library();

$lib->addBook(new Book('1984', 'George Orwell'));
$lib->addBook(new Book('De Avonden', 'Gerard Reve'));

$alice = new Member('Alice');
$bob   = new Member('Bob');
$lib->addMember($alice);
$lib->addMember($bob);

echo $lib->lendBook('1984', 'Alice'), PHP_EOL;
echo $lib->lendBook('1984', 'Bob'), PHP_EOL;
echo $lib->listBooks(), PHP_EOL;
echo $lib->returnBook('1984', 'Alice'), PHP_EOL;
echo $lib->listBooks(), PHP_EOL;
?>
Opdracht: draai dit script en verifieer de uitvoer.

🧠 Reflectie

  1. Hoe voorkom je dat een lid hetzelfde boek twee keer kan lenen?
  2. Waarom is $available private in Book en hoe controleer je dit in Library?
  3. Wat gebeurt er als je lendBook() aanroept op een boek dat niet beschikbaar is?
  4. Hoe kun je de classes uitbreiden met een uitleendatum en terugbrengdatum?

📤 Inleveren

  • les7-book.php
  • les7-member.php
  • les7-library.php
  • les7-test.php
  • Reflectie: reflectie-les7-<jouw-naam>.txt

7 Complete mini‐project

(ga niet verder voordat je de vorige opdracht goed hebt afgerond)

🎯 Leerdoelen

  • Je past classes, objects en constructors toe.
  • Je gebruikt public en private properties met getters/setters.
  • Je schrijft methods met parameters en returnwaardes.
  • Je beheert data in een klein OOP‐systeem.

💡 Uitleg

Je bouwt een klein “winkelmandje”‐systeem in PHP. Je maakt twee classes:

  • Product met private $naam, private $prijs en een constructor.
    Voeg getters toe: getNaam() en getPrijs().
  • Winkelmandje met private $items = [].
    Voeg methods toe om voegToe(Product $p, int $aantal), verwijder(Product $p) en getTotaal(): float te implementeren.

🛠️ Opdracht – Winkelmandje bouwen

  1. Maak bestand les6-product.php en definieer class Product:
    <?php
    class Product {
        private $naam;
        private $prijs;
    
        public function __construct(string $naam, float $prijs) {
            // ...
        }
    
        public function getNaam(): string {
            // ...
        }
    
        public function getPrijs(): float {
            // ...
        }
    }
    ?>
  2. Maak bestand les6-winkelmandje.php en definieer class Winkelmandje:
    <?php
    class Winkelmandje {
        private $items = []; // array van ['product' => Product, 'aantal' => int]
    
        public function voegToe(Product $p, int $aantal): void {
            // voeg product toe of verhoog aantal
            // Kijk of het product al in het mandje zit
    
            // loop door het winkelmandje heen
            foreach ($this->items as &$item) {
                if ($item['product']->getNaam() === $p->getNaam()) { // kijk of we het prodcut al hebben
                    // Verhoog het bestaande aantal
                    $item['aantal'] += $aantal;
                    return; // klaar
                }
            }
        
            // Anders (hebben we geen return gehad dus: nieuw item toevoegen
            $this->items[] = [
                'product' => $p,
                'aantal'  => $aantal
            ];
        }
    
        public function verwijder(Product $p): void {
            // verwijder product volledig uit items
            ......
        }
    
        public function getTotaal(): float {
            // bereken en return totaalprijs
            ......
        }
    }
    ?>
  3. Maak een testscript les6-test.php:
    <?php
    require 'les6-product.php';
    require 'les6-winkelmandje.php';
    
    $p1 = new Product("Boek OOP", 25.50);
    $p2 = new Product("USB-stick", 8.99);
    
    $mandje = new Winkelmandje();
    $mandje->voegToe($p1, 2);
    $mandje->voegToe($p2, 1);
    $mandje->verwijder($p2);
    
    echo "Totaal: €" . $mandje->getTotaal();
    ?>

🧠 Reflectie

  • Hoe zorg je ervoor dat een Product niet negatief geprijsd kan zijn?
  • Wat gebeurt er als je voegToe aanroept met $aantal = 0?
  • Waarom gebruik je hier private properties en geen public?
  • Hoe kun je de code uitbreiden met een updateAantal(Product $p, int $nieuwAantal)?
  • In de function voegToe(Product $p, int $aantal) moeten we controleren of het prodcut al bestaat. Als dat zo is dan verhogen we het aantal, aders moeten we het product aanmaken. We zouden verwachten dat we met een if-then-else controleren of eht product al bestaat. Waarom staat er in de code geen if-then-else?

📤 Inleveren

  • Bestanden: les6-product.php, les6-winkelmandje.php, les6-test.php
  • Reflectie in apart bestand: reflectie-les6-<jouw-naam>.txt