Hoofdstuk 8: Functies

← Terug naar overzicht

Functies definieren

Een functie is een herbruikbaar blok code met een naam. In plaats van dezelfde code steeds opnieuw te schrijven, maak je een functie die je zo vaak kunt aanroepen als je wilt. Dit is het DRY-principe: Don't Repeat Yourself.

<?php
// Functie definiëren
function begroet() {
    echo "Hallo wereld!<br>";
}

// Functie aanroepen
begroet(); // toont: Hallo wereld!
begroet(); // toont: Hallo wereld!

// Functie met parameter
function begroetNaam($naam) {
    echo "Hallo " . $naam . "!<br>";
}

begroetNaam("Jan");  // toont: Hallo Jan!
begroetNaam("Lisa"); // toont: Hallo Lisa!
?>

Een functie definieer je met het keyword function, gevolgd door de naam en haakjes (). Parameters staan tussen de haakjes.

Functies in PHP werken net als in JavaScript. Het verschil is dat PHP function gebruikt zonder let of const, en variabelen beginnen altijd met $. Functienamen schrijven we in camelCase: berekenBtw, toonProduct, haalVoorraadOp.

Oefening 1

Maak een functie toonWelkom die de tekst "Welkom op onze website!<br>" echo't. Roep de functie daarna aan.

Jouw code:

Oefening 2

Maak een functie toonNaam die een parameter $naam accepteert en de tekst "Hallo, " gevolgd door de naam en "!<br>" echo't. Roep de functie aan met "Sophie" en met "Ruben".

Jouw code:

Oefening 3

Maak een functie telOp die twee parameters $a en $b accepteert. De functie echo't $a + $b. Roep de functie aan met de waarden 15 en 27.

Jouw code:

Oefening 4

Maak een functie toonTafel die een parameter $getal accepteert. De functie toont de tafel van dat getal (van 1 tot 10) met een for-lus. Echo per regel: $getal, " x ", $i, " = ", het resultaat, gevolgd door <br>. Roep de functie aan met 6.

Jouw code:

Oefening 5

Maak een functie berekenSom die een parameter $n accepteert en de som van alle getallen van 1 tot en met $n berekent. De functie retourneert (return) het resultaat in plaats van het te echoeen. Roep de functie aan met 100 en echo "De som is: " gevolgd door het resultaat.

Jouw code:

Oefening 6

Maak een functie isEven die een parameter $getal accepteert. De functie retourneert true als het getal even is, en false als het oneven is. Test de functie: loop met een for-lus van 1 tot 10 en echo per getal of het even of oneven is met behulp van de functie.

Jouw code:

Oefening 7

Maak een functie toonProduct die drie parameters accepteert: $naam, $prijs en $voorraad. De functie echo't een productkaart in HTML: <div>, een <h3> met de naam, een <p> met "Prijs: EUR " en de prijs, een <p> met "Voorraad: " en het aantal, en een sluitende </div>. Roep de functie 3 keer aan met verschillende producten.

Jouw code:

Default Parameters & Return Values

Je kunt parameters een standaardwaarde (default) geven. Als je de functie aanroept zonder die parameter mee te geven, wordt de standaardwaarde gebruikt.

<?php
function berekenBtw($bedrag, $percentage = 21) {
    return $bedrag * $percentage / 100;
}

echo berekenBtw(100);      // 21 (gebruikt default 21%)
echo berekenBtw(100, 9);   // 9 (gebruikt meegegeven 9%)
?>

De functie number_format() is handig om getallen netjes te formatteren:

<?php
$prijs = 1234.5;
echo number_format($prijs, 2, ',', '.');
// toont: 1.234,50
?>

De parameters van number_format() zijn: het getal, aantal decimalen, decimaalteken, duizendtal-scheidingsteken.

Parameters met een standaardwaarde moeten altijd NA de verplichte parameters staan. Dus function berekenBtw($bedrag, $percentage = 21) is correct, maar function berekenBtw($percentage = 21, $bedrag) geeft problemen.

Oefening 1

Maak een functie berekenBtw met parameters $bedrag en $percentage (default 21). De functie retourneert het BTW-bedrag ($bedrag * $percentage / 100). Test met: echo de BTW op 250 euro (standaard 21%) en de BTW op 250 euro met 9%.

Jouw code:

Oefening 2

Maak een functie formatteerPrijs die een parameter $bedrag accepteert. De functie retourneert "EUR " gevolgd door het bedrag geformatteerd met number_format() (2 decimalen, komma als decimaalteken, punt als duizendtalscheidingsteken). Test met 1234.5 en 99.

Jouw code:

Oefening 3

Maak een functie berekenInclBtw die twee parameters accepteert: $bedrag en $btwPercentage (default 21). De functie retourneert het totaalbedrag inclusief BTW. Test de functie: echo voor een bedrag van 500 euro de prijs inclusief 21% BTW en inclusief 9% BTW. Gebruik number_format() om het resultaat met 2 decimalen te tonen.

Jouw code:

Oefening 4

Maak een functie maakBegroeting met parameters $naam, $aanhef (default "Beste") en $afsluiting (default "Met vriendelijke groet"). De functie retourneert een string: de aanhef, een spatie, de naam, een komma, <br><br>, "Welkom op ons platform!", <br><br>, en de afsluiting. Test met alleen een naam, en met alle drie parameters.

Jouw code:

Oefening 5

Maak twee functies: berekenBtw($bedrag, $percentage = 21) die het BTW-bedrag retourneert, en formatteerPrijs($bedrag) die "EUR " en het geformatteerde bedrag retourneert. Combineer beide: maak een variabele $nettoPrijs met waarde 750. Bereken de BTW, bereken het totaal (netto + BTW), en echo alles netjes met formatteerPrijs().

Jouw code:

Oefening 6

Maak een functie berekenKorting met parameters $prijs, $kortingPercentage (default 10) en $isLid (default false). Als $isLid true is, krijgt de klant 5% extra korting bovenop het kortingpercentage. De functie retourneert de prijs na korting. Test met: een prijs van 200 zonder extra parameters, en een prijs van 200 met 15% korting voor een lid.

Jouw code:

Oefening 7

Winkelwagen: maak een functie berekenTotaal die een array $producten accepteert (multidimensionaal, elk product heeft "naam", "prijs" en "aantal") en een default parameter $korting (default 0). De functie berekent het totaal (prijs x aantal per product), trekt de korting als percentage af, en retourneert het eindbedrag. Maak ook een functie formatteerPrijs($bedrag). Test met een winkelwagen van 3 producten, eenmaal zonder korting en eenmaal met 10% korting.

Jouw code:

Variabele Scope

Scope bepaalt waar een variabele beschikbaar is. In PHP heeft elke functie zijn eigen lokale scope. Variabelen die buiten een functie bestaan (globaal) zijn NIET automatisch beschikbaar binnen de functie, en andersom.

<?php
$naam = "Jan"; // globale variabele

function toonNaam() {
    // $naam is hier NIET beschikbaar!
    echo $naam; // geeft een fout/waarschuwing
}

function toonNaamGoed($naam) {
    // $naam is hier WEL beschikbaar als parameter
    echo $naam;
}

toonNaamGoed($naam); // werkt correct
?>

PHP heeft het keyword global waarmee je globale variabelen KUNT benaderen in een functie, maar dit wordt sterk afgeraden! Het maakt je code moeilijk te begrijpen en te onderhouden. Geef data altijd door via parameters en retourneer resultaten met return. Dit houdt je functies voorspelbaar en herbruikbaar.

Oefening 1

Maak een variabele $bericht met waarde "Hallo wereld". Maak een functie toonBericht die $bericht probeert te echoeen. Roep de functie aan. Je zult zien dat er NIETS getoond wordt (of een waarschuwing). Echo daarna buiten de functie de variabele $bericht om te bewijzen dat die daar WEL bestaat.

Jouw code:

Oefening 2

Los het scope-probleem op met parameters. Maak een variabele $bericht met waarde "Hallo wereld". Maak een functie toonBericht die een parameter $tekst accepteert en deze echo't. Roep de functie aan met $bericht als argument.

Jouw code:

Oefening 3

Maak een functie verhoogWaarde die een parameter $getal accepteert, er 10 bij optelt, en het resultaat retourneert (NIET echo't). Maak een variabele $waarde met waarde 5. Roep de functie aan en sla het resultaat op in $nieuweWaarde. Echo "Origineel: " gevolgd door $waarde, dan <br>, dan "Nieuw: " gevolgd door $nieuweWaarde.

Jouw code:

Oefening 4

Bewijs dat lokale variabelen niet buiten de functie bestaan. Maak een functie maakVariabele die een lokale variabele $geheim aanmaakt met waarde "verborgen" en deze echo't. Roep de functie aan. Probeer daarna buiten de functie $geheim te echoeen (dit zal niet werken). Echo ter verduidelijking "<br>Buiten functie: variabele bestaat niet".

Jouw code:

Oefening 5

Maak een functie berekenTotaalMetKorting met parameters $prijzen (een array), $kortingPercentage (default 0). De functie berekent het totaal van alle prijzen, past de korting toe, en retourneert het eindbedrag. Maak een array $productPrijzen met 45.00, 12.50, 89.99, 23.75. Bereken het totaal zonder korting en met 15% korting. Echo beide resultaten.

Jouw code:

Oefening 6

Best practice demonstratie: maak een complete mini-applicatie met drie functies. 1) berekenBtw($bedrag, $percentage = 21) retourneert het BTW-bedrag. 2) formatteerPrijs($bedrag) retourneert het bedrag als "EUR x,xx". 3) toonFactuurRegel($naam, $prijs, $aantal) echo't een HTML-tabelrij met productnaam, prijs, aantal, subtotaal (prijs x aantal incl. BTW) - allemaal geformatteerd. Maak een array met 3 producten, echo een HTML-tabel en bereken het totaal inclusief BTW.

Jouw code:

Oefening 7

Scope challenge: maak een functie verwerkBestelling die een array $items (elk met "naam", "prijs", "aantal") en een boolean $isLid (default false) accepteert. Leden krijgen 10% korting. De functie berekent het totaal, past eventueel korting toe, voegt 21% BTW toe, en retourneert een associatieve array met keys "subtotaal", "korting", "btw" en "totaal". Test met een bestelling van 3 items, eenmaal als lid en eenmaal als niet-lid. Echo alle bedragen netjes met number_format().

Jouw code:

Samenvatting

In dit hoofdstuk heb je geleerd: