Je ziet dit bericht omdat de EU dat een goed idee vindt. Deze website maakt gebruik van cookies van Google voor het tonen van advertenties en het bijhouden van bezoekersstatistieken. Google kan hiermee je surfgedrag volgen. Zie voor meer informatie het privacybeleid van Google. Via Your Online Choices kun tracking cookies van advertentiebedrijven blokkeren. Deze melding verbergen.

5 Code Opmaak

Om scripts leesbaar te houden is het verstandig om een bepaalde consequente structuur aan te houden. Te denken valt aan waar wel en waar geen spaties geplaatst worden, waar accolades komen te staan, welke regels worden ingesprongen, etc.

Er zijn vele manieren om hiermee om te gaan. Welke manier ook gekozen wordt, het belangrijkste is dat deze consequent wordt toegepast. Vooral als met meerdere mensen aan één project wordt gewerkt, is het verstandig om vooraf enige afspraken te maken over de opmaak van de code.

Dit hoofdstuk bespreekt de opmaakregels die in dit boek worden toegepast. Deze opmaakregels kunnen als richtlijn bij het schrijven van eigen scripts worden gebruikt, of kan als basis dienen voor eigen opmaakregels.

Theorie

In deze bespreking wordt uitgegaan van onderstaande (overigens codetechnisch correcte!) voorbeeld PHP-code. Deze code zal in de volgende paragrafen stap voor stap van opmaak voorzien worden. Op het moment is de code niet echt leesbaar. Iemand die de code niet zelf geschreven heeft, zal grote moeite hebben om te begrijpen wat er hier gebeurt. Ook in geval van eigen code waar al een tijd niet meer naar om is gekeken, is het in onderstaand voorbeeld lastig om in te zien wat er nu precies gebeurt.

$wachtwoord='ASDY%$SSVGSW';$wachtwoordlengte=strlen($wachtwoord);if($wachtwoordlengte>=6){if($wachtwoordlengte>=8){echo'De lengte van dit wachtwoord is voldoende.';}else{echo'Het is verstandig om een iets langer wachtwoord te kiezen.';}}else{echo'Dit wachtwoord is te kort. ';echo'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';$dubbelwachtwoord=$wachtwoord.$wachtwoord;echo'Bijvoorbeeld: '.$dubbelwachtwoord;}

Nieuwe regels

Allereerst is het verstandig om iedere instructie op een nieuwe regel te beginnen:

$wachtwoord='ASDY%$SSVGSW';
$wachtwoordlengte=strlen($wachtwoord);
if(
$wachtwoordlengte>=6){
if(
$wachtwoordlengte>=8){
echo
'De lengte van dit wachtwoord is voldoende.';}
else{
echo
'Het is verstandig om een iets langer wachtwoord te kiezen.';}}
else{
echo
'Dit wachtwoord is te kort. ';
echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
$dubbelwachtwoord=$wachtwoord.$wachtwoord;
echo
'Bijvoorbeeld: '.$dubbelwachtwoord;}

Nog niet optimaal, maar toch al heel wat overzichtelijker.

Spaties

Een goed gebruik is om verschillende elementen door spaties te scheiden. Zo wordt er een spatie gezet tussen de naam van een variabele en het =-teken dat een waarde aan deze variabele toekent. Zo staat er ook een spatie aan de andere kant van dat =-teken, voor de werkelijke waarde die aan de variabele wordt toegekend.

Vergelijkingsoperatoren en logische operatoren worden ook aan beide kanten omringd door een spatie.

Verder komt er voor ieder haakje-openen een spatie, maar over het algemeen niet erna. Ditzelfde is van toepassing op accolades. Tussen de naam van een functie en het haakje dat het begin van de parameterlijst aangeeft komt juist weer geen spatie.

$wachtwoord = 'ASDY%$SSVGSW';
$wachtwoordlengte = strlen($wachtwoord);
if (
$wachtwoordlengte >= 6) {
if (
$wachtwoordlengte >= 8) {
echo
'De lengte van dit wachtwoord is voldoende.'; }
else {
echo
'Het is verstandig om een iets langer wachtwoord te kiezen.'; }}
else {
echo
'Dit wachtwoord is te kort. ';
echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
$dubbelwachtwoord = $wachtwoord . $wachtwoord;
echo
'Bijvoorbeeld: '.$dubbelwachtwoord; }

Ook komen er spaties aan beide kanten van de punt die twee variabelen aan elkaar koppelt, maar niet als een hardcoded tekst en een variabele worden gekoppeld.

echo, else, if en vergelijkbare elementen worden eveneens gevolgd door een spatie, maar de afsluitende puntkomma wordt niet voorafgegaan door een spatie

Accolades

Een openende accolade komt direct achter de bijbehorende uitdrukking. Iedere sluitende accolade krijgt een eigen regel.

$wachtwoord = 'ASDY%$SSVGSW';
$wachtwoordlengte = strlen($wachtwoord);
if (
$wachtwoordlengte >= 6) {
if (
$wachtwoordlengte >= 8) {
echo
'De lengte van dit wachtwoord is voldoende.';
}
else {
echo
'Het is verstandig om een iets langer wachtwoord te kiezen.';
}
}
else {
echo
'Dit wachtwoord is te kort. ';
echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
$dubbelwachtwoord = $wachtwoord . $wachtwoord;
echo
'Bijvoorbeeld: '.$dubbelwachtwoord;
}

Tabs

Naast het op een nieuwe regel plaatsen van iedere instructie is het gebruik van tabs de belangrijkste opmaakregel: de code indent. Hiermee wordt direct duidelijk waar een codedeel dat tussen accolades staat toe behoort:

$wachtwoord = 'ASDY%$SSVGSW';
$wachtwoordlengte = strlen($wachtwoord);
if (
$wachtwoordlengte >= 6) {
    if (
$wachtwoordlengte >= 8) {
        echo
'De lengte van dit wachtwoord is voldoende.';
    }
    else {
        echo
'Het is verstandig om een iets langer wachtwoord te kiezen.';
    }
}
else {
    echo
'Dit wachtwoord is te kort. ';
    echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
    
$dubbelwachtwoord = $wachtwoord . $wachtwoord;
    echo
'Bijvoorbeeld: '.$dubbelwachtwoord;
}

Lege regels

Vaak worden lege regels gebruikt om verschillende soorten code uit elkaar te houden, zoals in onderstaand voorbeeld. Het kan geen kwaad om zo nu en dan een lege regel in te voegen om het overzicht te kunnen bewaren. Verschillende scriptonderdelen die weinig met elkaar te maken hebben worden vaak gescheiden door drie of meer lege regels.

$wachtwoord = 'ASDY%$SSVGSW';
$wachtwoordlengte = strlen($wachtwoord);

if (
$wachtwoordlengte >= 6) {
    if (
$wachtwoordlengte >= 8) {
        echo
'De lengte van dit wachtwoord is voldoende.';
    }
    else {
        echo
'Het is verstandig om een iets langer wachtwoord te kiezen.';
    }
}
else {
    echo
'Dit wachtwoord is te kort. ';
    echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
    
    
$dubbelwachtwoord = $wachtwoord . $wachtwoord;
    
    echo
'Bijvoorbeeld: '.$dubbelwachtwoord;
}

Commentaar

Behalve deze opmaak is het verstandig om commentaar te gebruiken om te beschrijven wat de code doet. Handig als iemand anders gecompliceerde code moet begrijpen of als eigen code na maanden verstoffen weer eens opgepakt wordt.

// geef wachtwoord op
$wachtwoord = 'ASDY%$SSVGSW';
// bepaal wachtwoordlengte
$wachtwoordlengte = strlen($wachtwoord);

//controleer wachtwoordlengte
if ($wachtwoordlengte >= 6) {
    
// als wachtwoord minstens 6 tekens:
    // controleer wachtwoordlengte
    
if ($wachtwoordlengte >= 8) {
        
// als wachtwoord minstens 8 tekens:
        
echo 'De lengte van dit wachtwoord is voldoende.';
    }
    else {
        
// als wachtwoord minder dan 8 tekens (maar nog steeds 6 of meer)
        
echo'Het is verstandig om een iets langer wachtwoord te kiezen.';
    }
}
else {
    
// als wachtwoord korter dan 6 tekens
    
echo'Dit wachtwoord is te kort. ';
    echo
'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';
    
    
// plaats wachtwoord twee keer achter elkaar
    
$dubbelwachtwoord = $wachtwoord . $wachtwoord;
    
    echo
'Bijvoorbeeld: '.$dubbelwachtwoord;
}

In geval van een if/else structuur wordt het algemene doel van de hele structuur voor de eerste if geplaatst. Het doel van specifieke onderdelen van de structuur wordt in het betreffende onderdeel geplaatst. Hieronder staat dit principe nogmaals verduidelijkt:

// algemene beschrijving if/else structuur
if (...) {
    
// specifieke omschrijving if-gedeelte
}
else {
    
// specifieke omschrijving else-gedeelte
}

Slotopmerking

Soms komt het voor dat een regel langer is dan in wat in de breedte van het beeldscherm past, zoals ook het geval is bij onderstaand gedeelte uit het voorbeeldscript:

    echo 'Het wachtwoord kan verlengd worden door eventueel twee keer hetzelfde achter elkaar te zetten. ';

Een oplossing hiervoor zou kunnen zijn om de regel over meerdere regels te splitsen in plaats van door te laten lopen:

    echo 'Het wachtwoord kan verlengd worden door eventueel twee keer '.
        
'hetzelfde achter elkaar te zetten. ';

Dit ziet er direct een stuk beter uit, maar bij iemand met een kleiner scherm gaat het opnieuw mis:

    echo 'Het wachtwoord kan verlengd worden door eventueel twee keer '.
        
'hetzelfde achter elkaar te zetten. ';

Een alternatieve oplossing is om de zogeheten word wrap in de PHP-editor uit te schakelen. Alles wat op één regel staat blijft nu op een regel staan. Het deel wat aan de rechterkant wegvalt kan nu door middel van horizontaal scrollen bereikt worden:

    echo 'Het wachtwoord kan verlengd worden door eventueel twee keer hetze';
<-[[[[[[[[[[]]]]]]]]]]------------------------------------------------------>

De laatste mogelijkheid is om verder niks van dit fenomeen aan te trekken. In dit boek is expliciet hiervoor gekozen. Het laten wegvallen van een gedeelte is voor een boek uiteraard geen goed idee. Het splitsen over meerdere regels maakt voorbeelden onnodig ingewikkeld. Daarnaast kunnen lezers in het bezit van de digitale versie van dit boek de voorbeelden eenvoudig kopiëren zonder dat de regelsplitsing op een voor hen op een onlogische plek komt te staan.

Zelftest

  1. Waarom is een correcte code opmaak belangrijk?
    1. Het verbetert de leesbaarheid van de code.
    2. PHP kan de code hierdoor beter begrijpen.
    3. Het is niet belangrijk, want het maakt bestanden onnodig veel groter.
    4. Er hoeft dan niet gescrolled te worden.
  2. Tabs worden gebruikt bij…
    1. …opsommingen.
    2. if/else constructies.
    3. echo's.
    4. …logische operatoren.
  3. Commentaar wordt gebruikt om…
    1. …de leesbaarheid van de code te verbeteren.
    2. …een instructie over meerdere regels te splitsen.
    3. …de begrijpbaarheid van de code te verbeteren.
    4. …aan te geven welk codegedeelte bij een if hoort.

Antwoorden zelftest

Antwoorden

  1. a
  2. b
  3. c

Oefening: code opmaak toepassen

Gegeven zijn twee PHP-code fragmenten:

fragment1.php

<?php if(strlen($wachtwoord)==0){echo'Er is geen wachtwoord ingevoerd.';echo'<br />';echo'Probeer het nogmaals.';}elseif($wachtwoord=='&^DEGDW#$'){echo'Welkom in de beveiligde omgeving van deze website.';}else{echo'Het ingevoerde wachtwoord is fout.';if($tweedepoging==TRUE){echo'Probeer het over een uur nogmaals.';}else{echo'Probeer nogmaals.';}$tweedepoging=TRUE;} ?>

fragment2.php

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

Opdracht

Verbeter de leesbaarheid van deze PHP-code fragmenten door code opmaak toe te passen.

Uitwerking opdracht

Uitwerking

fragment1.php

<?php
if(strlen($wachtwoord) == 0) {
    echo
'Er is geen wachtwoord ingevoerd.';
    echo
'<br />';
    echo
'Probeer het nogmaals.';
}
elseif(
$wachtwoord == '&^DEGDW#$') {
    echo
'Welkom in de beveiligde omgeving van deze website.';
}
else {
    echo
'Het ingevoerde wachtwoord is fout.';
    
    if(
$tweedepoging == TRUE) {
        echo
'Probeer het over een uur nogmaals.';
    }
    else {
        echo
'Probeer nogmaals.';
    }
    
    
$tweedepoging = TRUE;
}
?>

fragment2.php

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