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.

14 Functies

PHP heeft heel veel functies ingebouwd. Een aantal daarvan zijn al in de voorgaande hoofdstukken voorbij gekomen. Maar het is ook mogelijk om zelf functies te maken. Dit hoofstuk gaat in op het zelf maken van functies en op recursieve functies. Recursieve functies zijn functies die naar zichzelf verwijzen, waarmee bijvoorbeeld boomstructuren gemaakt kunnen worden.

Theorie

Wanneer een stuk code op meerdere plaatsen, binnen hetzelfde script of in verschillende scripts, gebruikt wordt, is het handig om dit stuk code in een functie te plaatsen. Hiermee wordt de code overzichtelijker en wijzigingen hoeven maar op één plaats doorgevoerd te worden.

Functie maken

function naam_functie( [ $par1 [, $par2 [, ...]]] ) {
    //functie code
}

De naam van de functie naam_functie is zelf te kiezen, maar mag niet al bestaan. Het overschrijven van ingebouwde PHP-functies of eigen functies die al gedefinieerd zijn is niet mogelijk. PHP zal dan een foutmelding geven en de uitvoering van het script wordt gestopt. Achter de naam van de functie wordt (optioneel) een lijst met variabelen gegeven, de parameters van de functie, tussen haakjes. Hierna volgt de daadwerkelijke inhoud van de functie tussen accolades. De werking van deze accolades is hetzelfde als bij if/else.

Functie zonder parameters

Laten we eens naar een eenvoudig voorbeeld kijken. In dit voorbeeld maken we een functie zonder parameters. De functie geeft de tekst Welkom op mijn website.

<?php
function welkom() {
    
$tekst = 'Welkom op mijn website';
    return
$tekst;    
}
?>

De naam van de functie is in dit geval welkom. Ook al zijn er geen parameters, toch moeten de twee haakjes () na de functienaam worden geschreven. Binnen de functie maken we de variabele $tekst. Let op, deze variabele $tekst bestaat alleen binnen de functie! Als variabele $tekst al eerder buiten de functie is gebruikt, blijft deze onaangetast.

Het sleutelwoord return geeft aan welke variabele de functie als resultaat terug moet geven. In dit geval is dat de string $tekst, maar een functie mag ook andere typen variabelen als resultaat geven, bijvoorbeeld een array als er meerdere waarden als resultaat gegeven moeten worden. Na return stopt de uitvoering van de functie.

Het bovenstaande voorbeeld doet op zichzelf nog niks. Hiermee is de functie alleen gedefiniëerd. Om de functie daadwerkelijk iets te laten doen, moet deze ook worden aangeroepen. Het aanroepen van een eigen functie gaat op dezelfde manier als ingebouwde functie.

<?php
function welkom() {
    
$tekst = 'Welkom op mijn website';
    return
$tekst;    
}

echo welkom();
?>

Bij het aanroepen van een functie is het belangrijk dat de functie daadwerkelijk bestaat. Aanroepen kan dus alleen na de definitie van de functie. In dit geval zorgt echo welkom(); er voor dat de tekst Welkom op mijn website wordt weergegeven, omdat de functie deze tekst als resultaat geeft.

Functie met parameters

Een functie kan ook een of meerdere parameters bevatten. Hiermee kan er bepaalde invoer aan de functie worden meegegeven. De functie kan dan iets met deze invoer doen om het resultaat van de functie hiervan afhankelijk te laten zijn. Het volgende voorbeeld is een functie met twee parameters.

<?php
function welkom2($tekst, $hoofdletters) {
    
//bepaal tekst
    
if ($tekst == 1) {
        
$uitvoer = 'Welkom op mijn website';
    }
    elseif (
$tekst == 2) {
        
$uitvoer = 'Tot ziens!';
    }
    
//bepaal hoofdletters
    
if ($hoofdletters == TRUE) {
        
$uitvoer = strtoupper($uitvoer);
    }
    
//geef resultaat
    
return $uitvoer;
}
?>

De eerste parameter $tekst bepaalt welke van de twee teksten wordt gegeven. De waarde van deze parameter kan 1 of 2 zijn. De tweede parameter $hoofdletters bepaalt of de tekst in hoofdletters moet worden weergegeven. Deze parameter moet TRUE zijn om de tekst in hoofdletters weer te geven (waarvoor dan weer PHP's eigen functie strtoupper wordt gebruikt). Merk op dat de namen van de variabelen die als parameter worden gebruikt en tussen haakjes staan achter de naam van de functie met dezelfde naam terugkomen in de functie.

Om deze functie aan te roepen moeten dus twee parameters worden meegegeven. Bij het aanroepen worden de parameters ook hier tussen de haakjes achter de naam van de functie meegegeven. Dit kan via variabelen, of door direct de waarden te schrijven.

<?php
$tekst = 1;
$hoofdl = TRUE;
echo
welkom2($tekst, $hoofdl);
echo
welkom2(2, FALSE);
?>

In dit stuk code is $tekst een andere variabele dan de $tekst binnen de functie, ookal hebben ze dezelfde naam!

Functie met optionele parameters

Parameters van functies kunnen ook optioneel gemaakt worden. In dat geval is het niet nodig om de parameter mee te geven bij het aanroepen van de functie. Hiervoor wordt in de functie-definitie een standaardwaarde aan de parameter gegeven.

In het volgende voorbeeld is het weergeven in hoofdletters van functie welkom2 optioneel gemaakt en staat dit standaard aan. Hiervoor is de tweede parameter aangepast tot $hoofdletters = TRUE. Achter het is-teken staat de standaardwaarde. Deze standaardwaarde wordt gebruikt als de betreffende parameter wordt weggelaten bij het aanroepen van de functie.

<?php
function welkom3($tekst, $hoofdletters = TRUE) {
    
//bepaal tekst
    
if ($tekst == 1) {
        
$uitvoer = 'Welkom op mijn website';
    }
    elseif (
$tekst == 2) {
        
$uitvoer = 'Tot ziens!';
    }
    
//bepaal hoofdletters
    
if ($hoofdletters == TRUE) {
        
$uitvoer = strtoupper($uitvoer);
    }
    
//geef resultaat
    
return $uitvoer;
}

$tekst = 1;
echo
welkom3($tekst);
echo
welkom3(2, FALSE);
?>

Functie in een apart bestand

Wanneer een functie in meerdere scripts gebruikt wordt, is het handig om de functie in een apart bestand te plaatsen. Bij wijzigingen hoeft de functie dan maar op één plek aangepast te worden. Via een include kan de functie dan in het script worden ingevoegd (zie hoofdstuk 3). Omdat een functie maar één keer gedefiniëerd mag worden, is het raadzaam om hiervoor include_once() of require_once()te gebruiken.

<?php
include_once('functie.php');
echo
welkom3($tekst);
?>

Recursieve functies

Recursieve functies zijn functies die naar zichzelf verwijzen. Dit kan handig zijn bij boomstructuren, zoals het weergeven van de inhoud van een multidimensionale array of het weergeven van een bestandsstructuur.

In onderstaand voorbeeld van een recursieve functie wordt een multidimensionale array met groenten en fruit weergegeven als een lijst. Het fruit is hierbij verdeeld naar kleuren. De functie maakt een lijst en doorloopt ieder element in de array. Als het element ook een array is, dan wordt de naam van de sleutel weergegeven in de lijst. Voor de array met waarden wordt een sublijst gemaakt en wordt de functie nogmaals losgelaten op deze sub-array. Dit gaat zo vaak door tot een element in de (sub-)array geen nieuwe array meer is. In dat geval wordt de waarde van het element in de lijst weergegeven. Op deze manier kan een array met meerdere niveau's worden weergegeven als een lijst met meerdere niveau's.

<?php
$eten
= array(
    
'fruit' => array('geel' => array('banaan', 'citroen'), 'oranje' => array('sinaasappel', 'mandarijn')),
    
'groente ' => array('asperge', 'broccoli', 'courgette')
);

function
eten_lijst($array) {
    
$lijst = '<ul>';
    foreach(
$array as $sleutel => $waarde) {
        if (
is_array($waarde)) {
            
$lijst .= '<li>'.$sleutel;
            
$lijst .= eten_lijst($waarde);
            
$lijst .= '</li>';
        }
        else {
            
$lijst .= '<li>'.$waarde.'</li>';
        }
    }
    
$lijst .= '</ul>';
    return
$lijst;
}

echo
eten_lijst($eten);
?>

Het resultaat van deze functie ziet er als volgt uit:

  • fruit
    • geel
      • banaan
      • citroen
    • oranje
      • sinaasappel
      • mandarijn
  • groente
    • asperge
    • broccoli
    • courgette

In het volgende hoofdstuk gebruiken we deze techniek om een bestandslijst te maken van bestanden op de server.

Zelftest

  1. Welke van onderstaande stellingen is/zijn waar?
    I             Met behulp van return wordt bepaald welke waarde door de functie wordt teruggegeven;
    II            Na return stopt de verdere uitvoering van de functie.
    1. Beide stellingen zijn onwaar.
    2. Alleen stelling I is waar.
    3. Alleen stelling II is waar.
    4. Beide stellingen zijn waar.
  2. Welke van onderstaande stellingen is/zijn waar?
    I             Een functie kan herhaling van code voorkomen;
    II            Een functie moet altijd in een apart bestand geplaatst worden.
    1. Beide stellingen zijn onwaar.
    2. Alleen stelling I is waar.
    3. Alleen stelling II is waar.
    4. Beide stellingen zijn waar.
  3. Welke van onderstaande stellingen is/zijn waar?
    I             Een functie heeft ten minste één parameter;
    II            Iedere parameter is verplicht.
    1. Beide stellingen zijn onwaar.
    2. Alleen stelling I is waar.
    3. Alleen stelling II is waar.
    4. Beide stellingen zijn waar.
  4. Een recursieve functie is een functie...
    1. ...die schuingedrukt wordt in de documentatie.
    2. ...zonder parameters.
    3. ...die naar zichzelf verwijst.
    4. ...functie met één parameter.

Antwoorden zelftest

Antwoorden

  1. d
  2. b
  3. a
  4. c

Oefening: in_array

Opdracht 1

De ingebouwde functie in_array() bepaalt of een waarde in een array voorkomt. Zie ook hoofdstuk 13. Stel dat PHP deze ingebouwde functie niet zou hebben, maak zelf een functie die hetzelfde doet en noem deze mijn_in_array.

Opdracht 2

Pas de functie aan zodat deze ook in alle niveau's van een multidimensionele array zoekt. Noem deze functie in_array_recursief.

Uitwerking opdracht

Uitwerking

opdracht1.php

<?php
function mijn_in_array($needle, $haystack) {
    foreach(
$haystack as $val) {
        if (
$needle == $val) {
            return
TRUE;
            
//break hoeft niet, omdat de functie stopt met return
        
}
        return
FALSE;
    }
}
?>

opdracht2.php

<?php
function in_array_recursief($needle, $haystack) {
    foreach(
$haystack as $val) {
        if (
is_array($val)) {
            if (
in_array_recursief($needle, $val) == TRUE) {
                return
TRUE;    
            }
        }
        elseif (
$needle == $val) {
            return
TRUE;
        }
    }
    return
FALSE;
}
?>