Les 4
Control flow
if, match, switch en lussen in PHP.
🎯 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. elifheet hierelseif(aan elkaar).- Logische operatoren zijn
&&(en),||(of) en!(niet). PHP kent ookand/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
matchvergelijkt strikt (===).- Meerdere waarden scheid je met komma's.
- Komt geen enkele tak overeen, dan krijg je een
UnhandledMatchError. Wil je een standaardwaarde, gebruik dandefault.
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
- Maak
rapport.phpmet een array$cijfers = [4.5, 7.0, 8.5, 5.5, 6.1]. - Toon per cijfer het oordeel via
match (true)(≥ 8 uitstekend, ≥ 5.5 voldoende, anders onvoldoende). - Toon op de laatste regel het aantal voldoendes:
Voldoendes: 4 van 5. beetje check php-les4
Samenvatting
if/elseif/elsemet haakjes en accolades;&&,||,!.- Gebruik
===en!==: geen typeomzetting, geen verrassingen. matchgeeft een waarde terug, vergelijkt strikt en kentdefault.for,whileenforeachwerken 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
Klaar? Controleer je werk met:
$ beetje check php-les4