OOP

1 Wat is OOP en waarom gebruiken we het?

🎯 Leerdoelen

💡 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?

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 funvtie 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

📤 Inleveren

2 Classes en objects

🎯 Leerdoelen

💡 Uitleg

Wat is een class?

Een class 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 class. Je maakt een object aan met new. Een class 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 properties 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 class

  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

📤 Inleveren

3 Constructors en eigenschappen

🎯 Leerdoelen

💡 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 class 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

📤 Inleveren

4 Methoden met parameters en returnwaardes

🎯 Leerdoelen

💡 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 class 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 class met een paar stortingen en paar opnames. Toon aan dat:
    •  dat stortingen het saldo verhogen
    • dat opnames het saldo verlagen
    • dat een te hoge opname het saldo niet verandert

Probeer het zonder code, maar kom je er niet uit dan kun je deze code als template gebruiken .

Template
echo "<pre>";

$rekening = new Rekening();

// Test 1: stort 50
// .......
echo "Test 1: verwacht 50 → resultaat: "......

// Test 2: opname van 20
// ......
echo "Test 2: verwacht 30 → resultaat: " ........

// Test 3: opname van 100 (te veel)
.......
echo "Test 3: verwacht nog steeds 30 → resultaat: " ........
  
echo "</pre>";

 

🧠 Reflectie

📤 Inleveren

 5 Checkpoint: Wat heb je geleerd?

🚦Samenvatting

  1. Classes & Objects

    • Je kent het verschil tussen een class (blauwdruk) en een object (instantie).

    • Je weet hoe je met new een object maakt.

  2. Properties & Methods

    • Je gebruikt public properties om data in een object op te slaan.

    • Je roept methods aan met parameters (method($param)) en begrijpt wat een returnwaarde is.

  3. Constructors

    • Je kunt een __construct() schrijven om bij creatie van een object meteen eigenschappen in te stellen.

    • Je weet dat $this->… verwijst naar de huidige instantie.

  4. Encapsulation Basics

    • Je begrijpt waarom je data soms private maakt en via getters/setters benadert.

Tip: Ga kort na of je in je eigen voorbeelden bovenstaande concepten herkent en toepast voordat je verdergaat naar encapsulation en private properties in Les 5.

🛠️ Opdracht

Maak van elk van de vier genoemde onderwerpen een mulitple choice vraag, met 3 foute en één goed antwoord. Als de vragen goed zijn dan zullen ze terug komen in de kennis-check.

Voorbeeld/template
Vraag: Wat is een object?
A: Dat is een variabele in een class.
B: Dat is een instantie van een class.
C: Dat is een functie in een class
D: Dat is een data-structuur in PHP.
Juiste antwoord is B

Vraag:
A:
B:
C:
D:
Juiste antwoord is:

Vraag:
A:
B:
C:
D:
Juiste antwoord is:

Vraag:
A:
B:
C:
D:
Juiste antwoord is:

Vraag:
A:
B:
C:
D:
Juiste antwoord is:

📤 Inleveren

De vier mulitple choice vragen in txt bestand.

6 Encapsulation en private properties

🎯 Leerdoelen

💡 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 class 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 class 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

📤 Inleveren

7 Bibliotheeksysteem met Twee Classes

🎯 Leerdoelen

💡 Uitleg

In dit mini-project bouw je een eenvoudig bibliotheeksysteem met slechts twee classes:

  1. Book: een boek met een titel, auteur en beschikbaarheidsstatus.
  2. Library: beheert een collectie boeken en wie ze geleend heeft.

🛠️ Opdracht – Bouw je eigen bibliotheek

Book Class

Book.php bevat de class Book waarmee je het object book kan maken.

Een boek heeft een title, een author en een available (beschikbaarheid). De class bevat getters en setters om deze properties te lezen en aan te passen.

book.php
<?php
class Book {
    private string $title;
    private string $author;
    private bool $available = true;

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

    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 $avail): void {
        $this->available = $avail;
    }

}
?>

Library Class

De class Library maakt gebruik van de class Book. Deze class kan boeken toevoegen aan de library, kan boeken uitlenen en boeken weer terugnemen. Als laatst is er een method waarmee je alle boeken uit de library kan tonen.

library.php
<?php
require_once 'book.php';

class Library {

    private array $books = [];
    private array $loans = [];

    public function addBook(Book $book): void {
        // Voeg het boek toe onder de sleutel van de titel
        $this->books[$book->getTitle()] = $book;
    }

    public function lendBook(string $title, string $member): string {
        // Bestaat het boek?
        if (!isset($this->books[$title])) {
            return "Boek “{$title}” bestaat niet.\n";
        }
        $book = $this->books[$title];

        // Is het al uitgeleend?
        if (!$book->isAvailable()) {
            return "Boek “{$title}” is al uitgeleend.\n";
        }

        // Leen uit
        $book->setAvailable(false);
        $this->loans[$title] = $member;
        return "{$member} leent “{$title}”.\n";
    }

    public function returnBook(string $title): string {
        // Bestaat het boek?
        if (!isset($this->books[$title])) {
            return "Boek “{$title}” bestaat niet.\n";
        }

        // Was het uitgeleend?
        if (!isset($this->loans[$title])) {
            return "Boek “{$title}” was niet uitgeleend.\n";
        }

        // Verwerk retour
        $member = $this->loans[$title];
        unset($this->loans[$title]);
        $this->books[$title]->setAvailable(true);
        return "{$member} brengt “{$title}” terug.\n";
    }

    public function listBooks(): string {
        $output = '';
        foreach ($this->books as $book) {
            if ($book->isAvailable()) {
                $status = 'beschikbaar';
            } else {
                $status = 'uitgeleend aan ' . $this->loans[$book->getTitle()];
            }
            $output .= $book->getTitle() . ' – ' . $status . "\n";
        }
        return $output;
    }
}

Main code

In de main code wordt de class library gebruikt om boeken in de library te zetten en uit te lenen of terug te nemen.

Met deze code wordt de library- en book class getest.

Kijk goed wat er gebeurt en probeer het te begrijpen.

main.php
<?php
require_once 'book.php';
require_once 'library.php';

echo '<pre>';

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

echo "Leen boek 1884 uit aan Alice<br>resultaat: ";
echo $lib->lendBook('1984', 'Alice');
echo "<br>";

echo "Leen boek 1884 uit aan Bob<br>resultaat: ";
echo $lib->lendBook('1984', 'Bob');   // Alice heeft het nog
echo "<br>";

echo "Laat alle Boeken zien<br>resultaat: ";
echo $lib->listBooks();
echo "<br>";

echo "Boek 1984 wordt tgeruggebracht<br>resultaat: ";
echo $lib->returnBook('1984');
echo "<br>";

echo "Leen boek 1884 uit aan Bob<br>resultaat: ";
echo $lib->lendBook('1984', 'Bob');   // nu kan Bob lenen
echo "<br>";

echo "Laat alle Boeken zien<br>resultaat: ";
echo $lib->listBooks();
echo "<br>";

echo '</pre>'
?>

Overzicht

Opdracht: draai dit script in je browser en verifieer de uitvoer.
Hier zie je een eenvoudige UML-class-diagram die laat zien hoe de class Library en de class Book met elkaar communiceren

image.png

  • Library

    • Bevat een collectie (books) van Book-objecten.

    • Methoden zoals addBook(), lendBook(), returnBook() en listBooks() gebruiken de Book-objecten.

  • Book

    • Heeft private eigenschappen: title, author, available (en eventueel loansCount).

    • Biedt publieke getters (getTitle(), isAvailable()) en een setter (setAvailable()) om zijn status te wijzigen.

De pijlen geven aan dat de Library klas methoden aanroept op de Book objecten, bijvoorbeeld bij het uitlenen (zetten available op false) en het terugbrengen (zetten available op true). Zo zie je visueel hoe de objecten samenwerken binnen het systeem.

🛠️ Opdracht

Van elk boek wi je bijhouden hoevaak ht is uitgeleend.

  1. Voeg een property toe aan de class Book en nome die $aantalKeerUitgeleend.
  2. Verhoog de property als een boek wordt uitgeleend met 1.
  3. Voeg een method getUileenData() toe in de class Book en laat deze van elk boek, de titel, auteur en het aantal keer dat dit boek is uitgeleend zien.
  4. Test dit via de code in mainn.php, 1984 is al twee maal uitgeleend, maak nog een derde boek en leen dat ook één maal uit.

Aan het iend hebben we dus drie boeken: één boek is nooit uitgleend, één boek is 1x uitgeleend en één boek is twee maal uitgleend.

🧠 Reflectie

  1. Wat doet de foreach loop in de method listBooks() ?
  2. Waarom is $author private in Book en kan je de $author van een Book wijzigen?
  3. In de key van $books uit de class Library staat de titel van het boek, wat staat er in de value?
  4. Beschijf wat er in de key en de value staat van de $loans uit de class Library.

📤 Inleveren

  1. De aangepast class Book (book.php).
  2. De aangepaste main.php
  3. Antwoord op de reflectievragen (pdf)

8 Complete mini‐project

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

🎯 Leerdoelen

💡 Uitleg

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

🛠️ 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

📤 Inleveren

9 Test je Kennis

Wat betekent OOP en hoe verschilt het van procedureel programmeren?

OOP staat voor Objectgeoriënteerd programmeren. In plaats van functies en variabelen apart te gebruiken, bundel je bij OOP data en gedrag in objecten. Zo kun je code beter organiseren, hergebruiken en opsplitsen in logische blokken .

Wat is een klasse in OOP?

Een klasse is een blauwdruk of sjabloon waarin je beschrijft welke gegevens (properties) en functies (methods) een object moet hebben .

Wat is een object?

Een object is een concreet exemplaar van een klasse, gemaakt met new. Je kunt meerdere objecten maken van dezelfde klasse, elk met eigen waarden .

Hoe noem je in OOP een variabele en een functie binnen een klasse?

In OOP noem je variabelen properties, en functies methods

Wat is encapsulation?

Encapsulation betekent dat je de data (properties) van een object beschermt. Je maakt gegevens vaak private en gebruikt methods om ze gecontroleerd te lezen of aanpassen .

Wat is het verschil tussen public en private properties/methods?
  • public: toegankelijk en aanpasbaar van buiten de class.

  • private: alleen toegankelijk binnen de class zelf. Dit beschermt de interne gegevens.

Waarom is OOP handig bij grote projecten?

Omdat je code makkelijker kunt organiseren in logische blokken (objecten), hergebruiken, uitbreiden en onderhouden. Daardoor is je programma stabieler en schaalbaarder .

Waarvoor genbruik je '$this' -> in PHP?

$this-> verwijst naar een property of een object uit dit object. Met dit object wordt bedoeld het object waar $this-> in staat.

7 Inheritance (Overerving)

🌟 Leerdoelen

💡 Uitleg

Wat is inheritance?

Inheritance betekent dat je een nieuwe class maakt die eigenschappen en methodes overneemt van een andere class. Dit heet overerving. De 'ouderclass' noem je ook wel de superclass, en de 'kindclass' de subclass.

Voorbeeld

<?php
class Dier {
    public $naam;

    public function adem() {
        echo $this->naam . " ademt.\n";
    }
}

class Hond extends Dier {
    public function blaf() {
        echo $this->naam . " zegt: Woef!\n";
    }
}

$rex = new Hond();
$rex->naam = "Rex";
$rex->adem(); // komt uit Dier
$rex->blaf(); // komt uit Hond
?>

👉 De class Hond erft de methode adem() van Dier, maar voegt ook zijn eigen gedrag toe: blaf().

🛠️ Opdracht – Maak je eigen dier met overerving

  1. Bestand: dier.php
    Maak een class Dier met:
    • een property $naam
    • een methode beweeg() die "{$this->naam} beweegt." toont
  2. Bestand: vogel.php
    Maak een class Vogel die extends Dier:
    • een methode vlieg() die "{$this->naam} vliegt!" toont
  3. Bestand: test.php
    • Maak een object $mus van de class Vogel
    • Stel zijn naam in op "Mus"
    • Roep zowel beweeg() als vlieg() aan

🧠 Reflectie

📄 Inleveren


Revision #19
Created 18 June 2025 14:33:53 by Max
Updated 29 June 2025 19:09:35 by Max