PHPBoek();
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.
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.
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.
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.
$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.
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.
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.
$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
- geel
- groente
- asperge
- broccoli
- courgette
In het volgende hoofdstuk gebruiken we deze techniek om een bestandslijst te maken van bestanden op de server.
Zelftest
- Welke van onderstaande stellingen is/zijn waar?
I Met behulp vanreturn
wordt bepaald welke waarde door de functie wordt teruggegeven;
II Nareturn
stopt de verdere uitvoering van de functie.- Beide stellingen zijn onwaar.
- Alleen stelling I is waar.
- Alleen stelling II is waar.
- Beide stellingen zijn waar.
- 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.- Beide stellingen zijn onwaar.
- Alleen stelling I is waar.
- Alleen stelling II is waar.
- Beide stellingen zijn waar.
- Welke van onderstaande stellingen is/zijn waar?
I Een functie heeft ten minste één parameter;
II Iedere parameter is verplicht.- Beide stellingen zijn onwaar.
- Alleen stelling I is waar.
- Alleen stelling II is waar.
- Beide stellingen zijn waar.
- Een recursieve functie is een functie...
- ...die schuingedrukt wordt in de documentatie.
- ...zonder parameters.
- ...die naar zichzelf verwijst.
- ...functie met één parameter.
Antwoorden
- d
- b
- a
- 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
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;
}
?>