PHPBoek();
4 Voorwaardelijke uitdrukkingen
Een voorwaardelijke uitdrukking maakt het mogelijk om onderdelen van een PHP-script wel of niet uit te voeren, afhankelijk van zelf te kiezen omstandigheden. Invoer van de gebruiker is een voorbeeld van dit soort omstandigheden, maar niet de enige mogelijkheid. Voorwaardelijke uitdrukkingen zijn wellicht het belangrijkste onderdeel van PHP: dit is wat dynamische webpagina's daadwerkelijk dynamisch maakt.
Dit hoofdstuk is vrij theoretisch van opzet. Meer praktische toepassingen van voorwaardelijke uitdrukkingen komen ter sprake in vervolghoofdstukken in combinatie met andere mogelijkheden van PHP.
Theorie
Voorwaardelijke uitdrukkingen worden opgesteld met behulp van if
, else
en elseif
constructies. Deze worden gebruikt in zogenaamde als-dan-anders-dan constructies. De basisvorm ziet er in pseudocode als volgt uit:
DAN voer deze code uit
ANDERS
DAN voer andere code uit
In het ALS-gedeelte wordt een vergelijking opgenomen, waarin twee variabelen met elkaar vergeleken worden. Als de vergelijking waar is, dan wordt alleen het stuk code onder ALS tot aan ANDERS uitgevoerd. Is de vergelijking onwaar, dan wordt alleen het stuk code onder ANDERS uitgevoerd.
Aangezien PHP een Engelstalige scripttaal is, worden ALS en ANDERS in het Engels als if
en else
geschreven. In tegenstelling tot sommige andere scripttalen, komt DAN niet letterlijk terug in PHP, zoals ook duidelijk zal worden in de volgende paragrafen.
If
if
is het gedeelte dat de vergelijking bevat die door PHP getoetst wordt. Zoals gezegd worden hier twee variabelen vergeleken. Er zijn verschillende soorten vergelijkingen mogelijk, maar vooralsnog zullen we ons beperken tot de is gelijk aan vergelijking.
In de vergelijking worden de twee te vergelijken variabelen gescheiden door een zogenoemde vergelijkingsoperator. Deze geeft aan op welke manier de variabelen vergeleken moeten worden. De vergelijkingsoperator voor is gelijk aan is twee =-tekens: ==
.
Tijd voor een voorbeeld:
echo 'a is gelijk aan b';
}
In bovenstaand voorbeeld worden $a
en $b
met elkaar vergeleken. Indien de twee variabelen aan elkaar gelijk zijn, wordt de tekst a is gelijk aan b weergegeven. Als de variabelen niet aan elkaar gelijk zijn, wordt die tekst niet weergegeven.
De accolades ({
en }
) geven aan welk gedeelte van het script afhankelijk is van de vergelijking. Er kunnen meerdere regels code tussen de accolades worden gezet, welke in zijn geheel wel of niet wordt uitgevoerd, afhankelijk van de uitkomst van de vergelijking.
echo 'a is gelijk aan b <br />';
echo 'de waarde van a is ' . $a;
}
In bovenstaand voorbeeld, worden beide regels tekst weergegeven als $a
gelijk is aan $b
en wordt niets weergegeven als de twee variabelen niet gelijk aan elkaar zijn.
In een voorwaardelijke uitdrukking kan ook weer een nieuwe voorwaardelijke uitdrukking worden opgenomen (en daar kan weer een nieuwe voorwaardelijke uitdrukking in opgenomen worden, etc.). Een if
kan dus weer een andere if
bevatten:
echo 'a is gelijk aan b';
if ($c == $d) {
echo 'c is gelijk aan d';
}
}
Als hierin $c
gelijk is aan $d
, maar $a
niet gelijk is aan $b
, dan wordt niets weergegeven.
Is $a
gelijk aan $b
, maar $c
niet gelijk aan $d
, dan wordt alleen de eerste zin getoond.
Zijn beide vergelijkingen waar, dan worden beide zinnen getoond.
Else
In de voorbeelden uit de voorgaande paragraaf gebeurt er niets als het resultaat van een vergelijking onwaar is. Het komt echter vaak voor dat juist een ander stuk code moet worden uitgevoerd als een vergelijking onwaar is. Dit is mogelijk met behulp van else
. Door na een if
-vergelijking (met bijbehorende code tussen accolades) een else
-constructie (met bijbehorende code tussen accolades) op te nemen, kan worden bepaald wat moet gebeuren als de if
-vergelijking onwaar is.
echo 'a is gelijk aan b';
}
else {
echo 'a is NIET gelijk aan b';
}
In else
kan vervolgens weer een nieuwe if
-uitdrukking met bijbehorende else
worden opgenomen, etc.
echo 'a is gelijk aan b';
}
else {
if ($c == $d) {
echo 'a is NIET gelijk aan b, maar c is wel gelijk aan d';
}
else {
echo 'a is NIET gelijk aan b en c is ook niet gelijk aan b';
}
}
Hierin wordt allereerst gekeken of $a
gelijk is aan $b
. Als dat zo is, wordt de zin a is gelijk aan b getoond en wordt de rest dat bij else hoort overgeslagen.
Is $a
niet gelijk is aan $b
, dan wordt gekeken of $c
gelijk is aan $d
. Als dat zo is, wordt de zin a is NIET gelijk aan b, maar c is wel gelijk aan d getoond en wordt de rest dat bij de tweede else hoort overgeslagen. Als blijkt dat $c
niet gelijk is aan $d
, dan wordt de zin a is NIET gelijk aan b en c is ook niet gelijk aan b getoond.
Elseif
elseif
kan gezien worden als een tussenstap tussen if
en else
. Hiermee kan dan een extra vergelijking getoetst worden, voordat de else
-code uitgevoerd wordt. De basisvorm in pseudocode wordt dan:
DAN voer deze code uit
ALS ANDERS (tweede vergelijking is waar)
DAN voer andere code uit
ANDERS
DAN voer weer andere code uit
Door gebruik te maken van elseif
wordt het laatste voorbeeld uit de voorgaande paragraaf een stuk overzichtelijker:
echo 'a is gelijk aan b';
}
elseif ($c == $d) {
echo 'a is NIET gelijk aan b, maar c is wel gelijk aan d';
}
else {
echo 'a is NIET gelijk aan b en c is ook niet gelijk aan b';
}
Het resultaat van dit code-fragment is exact hetzelfde als het laatste voorbeeld uit de voorgaande paragraaf, maar is wel enigszins overzichtelijker. In een elseif
kunnen uiteraard ook weer nieuwe if
's, elseif
's en else
n opgenomen worden.
Het feit dat het gebruik van elseif
de code een stuk overzichtelijker maakt dan het domweg opnemen van nieuwe if
's in de laatste else
, wordt duidelijker aan de hand van het volgende voorbeeld:
echo 'a is gelijk aan b';
}
else {
if ($a == $c) {
echo 'a is gelijk aan c';
}
else {
if ($a == $d) {
echo 'a is gelijk aan d';
}
else {
if ($a == $e) {
echo 'a is gelijk aan e';
}
else {
if ($a == $f) {
echo 'a is gelijk aan f';
}
else {
if ($a == $g) {
echo 'a is gelijk aan g';
}
else {
if ($a == $h) {
echo 'a is gelijk aan h';
}
else {
echo 'a nergens gelijk aan';
}
}
}
}
}
}
}
In het voorgaande voorbeeld is het erg onduidelijk waar al die sluitende accolades (}
) op het eind nu allemaal bij horen. Door gebruik te maken van elseif
treedt dat probleem niet op en daarnaast is de code ook nog een stuk korter. In het bovenstaande voorbeeld kan in feite iedere if
die direct na een else {
staat worden samengevoegd tot een elseif {
:
if ($a == $b) {
echo 'a is gelijk aan b';
}
elseif ($a == $c) {
echo 'a is gelijk aan c';
}
elseif ($a == $d) {
echo 'a is gelijk aan d';
}
elseif ($a == $e) {
echo 'a is gelijk aan e';
}
elseif ($a == $f) {
echo 'a is gelijk aan f';
}
elseif ($a == $g) {
echo 'a is gelijk aan g';
}
elseif ($a == $h) {
echo 'a is gelijk aan h';
}
else {
echo 'a nergens gelijk aan';
}
//En de hele serie sluitende accolades is verdwenen.
Soorten vergelijkingen
Naast vergelijkingen gelijk aan zijn er ook nog andere soorten vergelijkingen. De vergelijkingsoperatoren voor bijvoorbeeld groter dan of kleiner dan zijn gelijk aan respectievelijk >
en <
. Zie tabel 4.1 voor een overzicht van alle vergelijkingsoperatoren.
Voorbeeld | Naam | Omschrijving |
---|---|---|
$a == $b |
Gelijk aan | WAAR als $a gelijk aan $b |
$a === $b |
Identiek aan | WAAR als $a en $b gelijk en hetzelfde type |
$a != $b |
Niet gelijk aan | WAAR als $a niet gelijk aan $b |
$a <> $b |
Niet gelijk aan | WAAR als $a niet gelijk aan $b |
$a !== $b |
Niet identiek aan | WAAR als $a en $b niet gelijk of verschillend type |
$a < $b |
Kleiner dan | WAAR als $a kleiner dan $b |
$a > $b |
Groter dan | WAAR als $a groter dan $b |
$a <= $b |
Kleiner dan of gelijk aan | WAAR als $a kleiner of gelijk aan $b |
$a >= $b |
Groter dan of gelijk aan | WAAR als $a groter of gelijk aan $b |
Zo kan bijvoorbeeld een if
-vergelijking worden gebruikt om te controleren of de zelftoets van dit hoofdstuk goed genoeg gemaakt is:
echo 'voldoende';
}
else {
echo 'onvoldoende';
}
Als $aantalfouten
alleen een geheel getal (ofwel een integer) kan zijn, is bovenstaand gelijk aan onderstaand:
echo 'voldoende';
}
else {
echo 'onvoldoende';
}
Immers, in het geval van integers is kleiner dan 3 (lager dan drie en geen drie) hetzelfde als kleiner of gelijk aan 2 (lager dan twee of twee).
Hardcoded vergelijkingen
In tegenstelling tot eerdere voorbeelden waar de ene variabele met de andere variabele vergeleken werd, is in de voorgaande paragraaf slechts één variabele vergeleken met een vaststaande waarde.
Een vergelijking waarin één variabele met een vaststaande waarde wordt vergeleken, noemen we een hardcoded vergelijking: de waarde staat keihard in de code en kan alleen handmatig gewijzigd worden. In een hardcoded vergelijking kunnen niet alleen integers worden vergeleken. Vergelijkingen van andere typen variabelen, zoals strings of booleans zijn ook mogelijk:
if ($aantalfouten < 3) {
echo 'voldoende';
}
//hardcoded string
if ($beoordeling == 'voldoende') {
echo 'voldoende';
}
//hardcoded boolean
if ($voldoende == TRUE) {
echo 'voldoende';
}
Meerdere vergelijkingen combineren
Het zal regelmatig voorkomen dat een if
-beslissing eigenlijk afhankelijk is van meer dan één voorwaarde. Nu kan voor iedere voorwaarde een aparte if
-beslissing geschreven worden, maar handiger is het om alle voorwaarden in één if
-beslissing op te nemen.
Hier komen de zogenaamde logische operatoren in actie. Deze logische operatoren maken het mogelijk om meerdere beslissingen tot één enkele voorwaarde samen te voegen. Een overzicht van de beschikbare logische operatoren is weergegeven in tabel 4.2.
Voorbeeld | Naam | Omschrijving |
---|---|---|
$a and $b |
En | WAAR als $a en $b beide WAAR zijn |
$a or $b |
Of | WAAR als $a WAAR is of $b WAAR is of beide WAAR zijn |
$a xor $b |
Exclusieve Of | WAAR als $a of $b WAAR is, maar niet beide WAAR zijn |
! $a |
Niet | WAAR als $a ONWAAR is |
$a && $b |
En | WAAR als $a en $b beide WAAR zijn |
$a || $b |
Of | WAAR als $a WAAR is of $b WAAR is of beide WAAR zijn |
De werking van de logische operatoren wordt toegelicht aan de hand van het volgende voorbeeld:
if ($a == $c) {
echo 'a is gelijk aan b en c';
}
}
In dit geval wordt de echo
alleen uitgevoerd als $a
, $b
en $c
gelijk aan elkaar zijn. Met behulp van de logische operator &&
is dit ook te schrijven als:
echo 'a is gelijk aan b en c';
}
Het resultaat hiervan is weer precies hetzelfde: als $a
gelijk is aan $b
en $a
gelijk is aan $c
wordt de echo uitgevoerd.
Omdat de logische operatoren alleen booleaanse vergelijkingen kunnen maken (dat wil zeggen; alleen iets kunnen met de waarden WAAR en ONWAAR), is onderstaand geen correcte PHP-code:
echo 'a is gelijk aan b en c';
}
Stel dat $a
, $b
en $c
de getallen 1, 3 en 5 zijn, dan gaat het mis op $b && $c. Vul de getallen in en er staat 3 && 5, terwijl PHP in plaats van getallen twee booleaanse waarden verwacht.
Daarom moet altijd eerst een vergelijking worden gemaakt met behulp van de vergelijkingsoperatoren uit tabel 4.1. Het resultaat van deze vergelijking is dan altijd een booleaanse waarde (WAAR of ONWAAR). Vervolgens kan hierop dan weer een logische operator uit tabel tabel 4.2 losgelaten worden.
Verkorte vorm
Als slechts één regel code afhankelijk is van een if
of elseif
, dan kan ook gebruik worden gemaakt van een verkorte vorm. In deze verkorte vorm worden de accolades weggelaten. Het laatste voorbeeld uit de voorgaande paragraaf is dan ook te schrijven als:
Evenzo is het laatste voorbeeld uit de paragraaf Elseif te schrijven als:
elseif ($a == $c) echo 'a is gelijk aan c';
elseif ($a == $d) echo 'a is gelijk aan d';
elseif ($a == $e) echo 'a is gelijk aan e';
elseif ($a == $f) echo 'a is gelijk aan f';
elseif ($a == $g) echo 'a is gelijk aan g';
elseif ($a == $h) echo 'a is gelijk aan h';
else echo 'a nergens gelijk aan';
Indien PHP geen accolades aantreft, sluit de eerstvolgende puntkomma en if
, elseif
of else
direct af. De verkorte vorm werkt dus alleen als er maar één statement afhankelijk is van de vergelijking in de voorwaarde.
Zelftest
- Kies de juiste volgorde:
elseif
,else
,if
if
,elseif
,else
if
,else
,elseif
else
,elseif
,if
- Wat geeft een openende accolade (
{
) aan?- Het begin van een PHP-script.
- Het begin van een
if
-vergelijking. - Het eind van een
else
-voorwaarde. - Het begin van een gedeelte voorwaardelijke PHP-code.
- Wat is de vergelijkingsoperator voor een vergelijking "groter dan of gelijk aan"?
- =>
- >=
- =+
- >
- Welk codefragment is correct?
I if ($var1 <= $var2 || var3) { }
II if ($var1 == ($var2 && var3) { }- Beide codefragmenten zijn correct.
- Alleen codefragment I is correct.
- Alleen codefragment II is correct.
- Beide codefragmenten zijn incorrect.
- De logische vergelijking $a
||
$b betekent:- WAAR als
$a
en$b
beide WAAR zijn. - ONWAAR als
$a
en$b
beide ONWAAR zijn. - WAAR als
$a
WAAR is of$b
WAAR is. - WAAR als
$a
ONWAAR is.
- WAAR als
- Hardcoded vergelijkingen zijn...
- …vergelijkingen afhankelijk van twee variabelen.
- …vergelijkingen van een variabele met een vaststaande waarde.
- …niet in PHP maar in HardCode geschreven vergelijkingen.
- …vergelijkingen die door de hardware en niet door de software worden opgelegd.
Antwoorden
- b
- d
- b
- d
- c
- b
Oefening: voorwaardelijke uitdrukkingen
Er zijn drie variabelen $a
, $b
en $c
die allen integers zijn. $a
mag vrij gekozen worden. $b
is altijd gelijk aan 3, $c
is altijd gelijk aan 8.
Opdracht
Schrijf een PHP-script en gebruik voorwaardelijke uitdrukkingen om te bepalen of $a
kleiner is dan $b
, gelijk is aan $b
, tussen $b
en $c
in ligt, gelijk is aan $c
of groter is dan $c
. Gebruik echo om de conclusie van de test in de browser weer te geven.
Test het PHP-script door verschillende waarden van $a
in te vullen.
Tip: gebruik drie elseif
's en één else
.
Uitwerking
opdracht.php
<?php
$a = 12;
$b = 3;
$c = 8;
if ($a < $b) {
echo 'a is kleiner dan b';
}
elseif ($a == $b) {
echo 'a is gelijk aan b';
}
elseif (($a > $b) && ($a < $c)) {
echo 'a is groter dan b en kleiner dan c';
}
elseif ($a == $c) {
echo 'a is gelijk aan c';
}
else {
//situatie ($a > $c), maar omdat dit de enige overgebleven mogelijkheid is hoeven we dat niet te controleren
echo 'a is groter dan c';
}
?>