Beetje Coderen

Les 4

Control flow

if, match, switch en lussen in PHP.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • if en match gebruiken
  • lussen schrijven
  • het verschil tussen == en === uitleggen

Keuzes en herhalingen ken je uit de hoofdcursus. PHP heeft dezelfde bouwstenen: if, lussen en een moderne match. De grootste valkuil zit in vergelijken: PHP heeft twee soorten "is gelijk aan", en je wilt bijna altijd de strenge.

if, elseif en else

<?php
declare(strict_types=1);

$cijfer = 6.8;

if ($cijfer >= 8) {
    echo "Uitstekend\n";
} elseif ($cijfer >= 5.5) {
    echo "Voldoende\n";
} else {
    echo "Onvoldoende\n";
}
Voldoende

Vergeleken met Python:

  • De voorwaarde staat tussen haakjes.
  • Het blok staat tussen accolades { }. Inspringen is voor de leesbaarheid, PHP kijkt er niet naar.
  • elif heet hier elseif (aan elkaar).
  • Logische operatoren zijn && (en), || (of) en ! (niet). PHP kent ook and/or, maar die hebben een verrassende voorrang; gebruik ze niet.
$leeftijd = 17;
$heeftToestemming = true;
if ($leeftijd >= 18 || $heeftToestemming) {
    echo "Je mag meedoen.\n";
}

Vergelijken: == versus ===

Operator Betekenis
== gelijk na typeomzetting (losse vergelijking)
=== gelijk én hetzelfde type (strikte vergelijking)
!= / !== het tegenovergestelde

Voorspel deze uitkomsten:

var_dump(1 == "1");     // ?
var_dump(1 === "1");    // ?
var_dump(0 == "");      // ?
var_dump(null == false);// ?
bool(true)
bool(false)
bool(false)
bool(true)

Met == probeert PHP de twee kanten eerst gelijk te maken. De regels daarvoor zijn ingewikkeld en zijn in PHP 8 nog veranderd. Met === hoef je niets te onthouden: verschillend type is altijd ongelijk.

Gebruik standaard === en !==. Kies alleen bewust voor == als je echt een losse vergelijking wilt, en zet er dan commentaar bij.

match

match kiest een waarde op basis van een uitdrukking. Het lijkt op match in Python 3.10, maar is eenvoudiger: het geeft een waarde terug.

$dag = "za";
$soort = match ($dag) {
    "ma", "di", "wo", "do", "vr" => "werkdag",
    "za", "zo" => "weekend",
};
echo $soort . "\n";   // weekend
  • match vergelijkt strikt (===).
  • Meerdere waarden scheid je met komma's.
  • Komt geen enkele tak overeen, dan krijg je een UnhandledMatchError. Wil je een standaardwaarde, gebruik dan default.

Een handig patroon is match (true), waarbij elke tak een voorwaarde is:

$cijfer = 7.4;
$oordeel = match (true) {
    $cijfer >= 8   => "uitstekend",
    $cijfer >= 5.5 => "voldoende",
    default        => "onvoldoende",
};
echo $oordeel . "\n";   // voldoende

PHP heeft ook nog het oudere switch. Dat vergelijkt los (==) en heeft break nodig; in nieuwe code is match bijna altijd duidelijker.

Lussen

for

for ($i = 1; $i <= 3; $i++) {
    echo "Ronde $i\n";
}

De drie delen tussen de haakjes zijn: beginwaarde; voorwaarde om door te gaan; wat na elke ronde gebeurt. $i++ betekent "tel 1 op". Dit is hetzelfde als for i in range(1, 4) in Python.

while

$saldo = 100;
$jaren = 0;
while ($saldo < 150) {
    $saldo *= 1.05;
    $jaren++;
}
echo "Na $jaren jaar is het saldo " . number_format($saldo, 2, ',', '.') . "\n";
Na 9 jaar is het saldo 155,13

foreach

Om alle elementen van een array langs te lopen gebruik je foreach. Dat is de PHP-versie van for x in lijst:

$namen = ["Sam", "Noor", "Daan"];
foreach ($namen as $naam) {
    echo "Hallo $naam\n";
}

Arrays bespreken we uitgebreid in de volgende les.

break stopt een lus, continue springt naar de volgende ronde, net als in Python.

Uitgewerkt voorbeeld: cijferrapport

<?php
declare(strict_types=1);

$cijfers = [8.1, 5.2, 6.7, 9.0];
$voldoendes = 0;

foreach ($cijfers as $cijfer) {
    $oordeel = match (true) {
        $cijfer >= 8   => "uitstekend",
        $cijfer >= 5.5 => "voldoende",
        default        => "onvoldoende",
    };
    if ($cijfer >= 5.5) {
        $voldoendes++;
    }
    echo "$cijfer: $oordeel\n";
}
echo "Voldoendes: $voldoendes van " . count($cijfers) . "\n";
8.1: uitstekend
5.2: onvoldoende
6.7: voldoende
9: uitstekend
Voldoendes: 3 van 4

Zie je dat 9.0 als 9 wordt getoond? PHP laat bij het omzetten van een float naar tekst overbodige nullen weg. Wil je altijd één decimaal, gebruik dan number_format($cijfer, 1).

Typische fouten

Symptoom Oorzaak
if ($x = 5) is altijd waar Eén = is een toewijzing. Vergelijken doe je met ===.
UnhandledMatchError: Unhandled match case Geen tak past en er is geen default.
Een lus stopt nooit De voorwaarde van while wordt nooit onwaar, bv. omdat je $jaren++ vergat. Stop met Ctrl+C.

Oefeningen

Oefening 1. Wat toont dit, en waarom?

$invoer = "0";
if ($invoer) { echo "ja\n"; } else { echo "nee\n"; }
Modelantwoord oefening 1

nee. In PHP is de string "0" falsy, net als "", 0, null en een lege array. In Python zou "0" juist waar zijn. Wil je weten of iemand iets heeft ingevuld, vergelijk dan expliciet: $invoer !== "".

Oefening 2. Schrijf met match een omzetting van een maandnummer (1–12) naar een seizoen (winter: 12, 1, 2; lente: 3–5; zomer: 6–8; herfst: 9–11).

Modelantwoord oefening 2
$maand = 4;
$seizoen = match ($maand) {
    12, 1, 2 => "winter",
    3, 4, 5  => "lente",
    6, 7, 8  => "zomer",
    9, 10, 11 => "herfst",
};
echo $seizoen . "\n";   // lente

Een maand als 13 geeft een UnhandledMatchError. Dat is hier prima: het is een ongeldige invoer.

Oefening 3. Print met een for-lus de tafel van 7 (1 x 7 = 7 tot en met 10 x 7 = 70).

Modelantwoord oefening 3
for ($i = 1; $i <= 10; $i++) {
    echo "$i x 7 = " . ($i * 7) . "\n";
}

De haakjes om $i * 7 zijn nodig: . en * hebben verschillende voorrang, en zo is het in elk geval duidelijk.

Lab: cijferrapport met match

  1. Maak rapport.php met een array $cijfers = [4.5, 7.0, 8.5, 5.5, 6.1].
  2. Toon per cijfer het oordeel via match (true) (≥ 8 uitstekend, ≥ 5.5 voldoende, anders onvoldoende).
  3. Toon op de laatste regel het aantal voldoendes: Voldoendes: 4 van 5.
  4. beetje check php-les4

Samenvatting

  • if/elseif/else met haakjes en accolades; &&, ||, !.
  • Gebruik === en !==: geen typeomzetting, geen verrassingen.
  • match geeft een waarde terug, vergelijkt strikt en kent default.
  • for, while en foreach werken zoals je uit Python kent, met een andere schrijfwijze.

Volgende les: arrays, de belangrijkste datastructuur van PHP.

Lab

Cijferrapport met match

💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:php-les4

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check php-les4

📝 Quiz: control flow

5 vragen · 70% nodig om te slagen

1. Wat geeft var_dump(1 === "1");
2. Wat gebeurt er als geen enkele tak van een match past en er geen default is?
3. Hoe schrijf je 'anders als' in PHP?
4. Is de string "0" waar of onwaar in een if?
5. Welke lus gebruik je om alle elementen van een array langs te lopen?