Deze website maakt gebruik van diensten van Google voor het tonen van advertenties en het bijhouden van bezoekersstatistieken. Google kan hiermee uw surfgedrag volgen. Zie voor meer informatie het privacybeleid van Google. Via Your Online Choices kunt u zich afmelden voor gepersonaliseerde advertenties. Deze melding verbergen.

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:

ALS (vergelijking is waar)
    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:

if ($a == $b) {
    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.

if ($a == $b) {
    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:

if ($a == $b) {
    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.

if ($a == $b) {
    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.

if ($a == $b) {
    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:

ALS (vergelijking is waar)
    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:

if ($a == $b) {
    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 elsen 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:

if ($a == $b) {
    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 {:

//Nogmaals hetzelfde, maar nu met behulp van 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.

Tabel 4.1: 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:

if ($aantalfouten < 3) {
    echo
'voldoende';
}
else {
    echo
'onvoldoende';
}

Als $aantalfouten alleen een geheel getal (ofwel een integer) kan zijn, is bovenstaand gelijk aan onderstaand:

if ($aantalfouten <= 2) {
    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:

//hardcoded integer
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.

Tabel 4.2: logische operatoren
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 == $b) {
    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:

if (($a == $b) && ($a == $c)) {
    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:

if ($a == $b && $c) {
    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:

if (($a == $b) && ($a == $c)) echo 'a is gelijk aan b en c';

Evenzo is het laatste voorbeeld uit de paragraaf Elseif te schrijven als:

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';

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

  1. Kies de juiste volgorde:
    1. elseif, else, if
    2. if, elseif, else
    3. if, else, elseif
    4. else, elseif, if
  2. Wat geeft een openende accolade ({) aan?
    1. Het begin van een PHP-script.
    2. Het begin van een if-vergelijking.
    3. Het eind van een else-voorwaarde.
    4. Het begin van een gedeelte voorwaardelijke PHP-code.
  3. Wat is de vergelijkingsoperator voor een vergelijking "groter dan of gelijk aan"?
    1. =>
    2. >=
    3. =+
    4. >
  4. Welk codefragment is correct?
    I             if ($var1 <= $var2 || var3) { }
    II            if ($var1 == ($var2 && var3) { }
    1. Beide codefragmenten zijn correct.
    2. Alleen codefragment I is correct.
    3. Alleen codefragment II is correct.
    4. Beide codefragmenten zijn incorrect.
  5. De logische vergelijking $a || $b betekent:
    1. WAAR als $a en $b beide WAAR zijn.
    2. ONWAAR als $a en $b beide ONWAAR zijn.
    3. WAAR als $a WAAR is of $b WAAR is.
    4. WAAR als $a ONWAAR is.
  6. Hardcoded vergelijkingen zijn...
    1. …vergelijkingen afhankelijk van twee variabelen.
    2. …vergelijkingen van een variabele met een vaststaande waarde.
    3. …niet in PHP maar in HardCode geschreven vergelijkingen.
    4. …vergelijkingen die door de hardware en niet door de software worden opgelegd.

Antwoorden zelftest

Antwoorden

  1. b
  2. d
  3. b
  4. d
  5. c
  6. 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

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';
}
?>