Functies in PHP

Waarom functies (1): ze verhogen het overzicht

Wanneer je een programma schrijft in een programmeertaal als Pascal, C of PHP dan kun je alle code onder elkaar in een grote file zetten en al die code vervolgens van boven tot beneden door de computer laten uitvoeren.
Voor een klein programmaatje gaat dat vaak nog wel, maar als je meer dan een A4-tje code schrijft wordt het al gauw onoverzichtelijk. In dat geval loont het de moeite om gedeelten uit je code die functioneel gezien bij elkaar horen in aparte brokken te stoppen. Zo'n brok geef je een naam die aangeeft wat het doet en je hebt daarmee de eenvoudigste vorm van een functie gemaakt.
Die functie kun je dan vanuit het hoofdprogramma aanroepen, waardoor je in het hoofdprogramma duidelijk de verschillende stappen in je programma kunt onderscheiden.

Waarom functies (2): hergebruik van stukken code

Als je een programma schrijft waarin meerdere keren ongeveer hetzelfde gebeurt dan is het vaak lonend om uit te zoeken of die herhaling altijd exact hetzelfde is en zo niet, op welke punten het verschilt.
In het eerste geval kun je de code die telkens herhaald wordt in een functie opnemen zodat je het maar 1 keer hoeft te maken en je kunt die functie dan zo vaak aanroepen als je wilt.
In het tweede geval ga je op zoek naar de grootste gemene deler van het stuk code dat met kleine verschillen telkens herhaald wordt. Goede kans dat je die code in een functie kunt stoppen en bij het aanroepen aangeven wat er anders is dan de vorige keer dat je de functie aanriep. Hoe je dat dan aangeeft bespreken we later.

Waarom functies (3): gebruik door anderen

Als programmeur kun je je lekker uitleven en mooie software schrijven waar je heel erg trots op bent en die jij helemaal begrijpt. Wanneer iemand anders met jouw software moet werken of jij wilt een stuk software van iemand anders gebruiken, dan zul je zien dat het niet meevalt om software uit te wisselen. Programmeurs zijn in het algemeen vrij eigenwijs en hebben vaak een eigen stijl van programmeren. De een gebruikt HoofdLetters Voor AlleVariabelen, de ander gebruikt_liever_underscores. De plaatsing van haakjes en het gebruik van tabs en spaties is ook vaak een kwestie van voorkeur en zo zijn er allerlei redenen om de code van iemand anders als slecht leesbaar te bestempelen.
Verder heb je niet altijd de tijd om je te verdiepen in alle details van andermans software maar wil je het gewoon gebruiken zonder te weten hoe het werkt.
Hier komen functies weer om de hoek kijken. Maak je nette functies die een bepaald gedeelte van jouw programma uitvoeren dan hoef je iemand anders alleen maar te vertellen hoe hij of zij die functie moet aanroepen om jouw functionaliteit in zijn of haar programma te gebruiken. Je geeft als het ware een stuk gereedschap en vertelt erbij hoe je het moet gebruiken maar niet hoe het werkt.

Het maken en aanroepen van een PHP-functie

In het algemeen ziet een PHP-functie er zo uit:

  <?php

  
function foo($argument) { // // hier komt jouw code // return $result; }
?>
Deze functie heeft de naam foo, heeft als enige argument de variabele $argument en geeft de waarde van variabele $result terug aan de code die foo heeft aangeroepen. Wat een argument is leg ik later uit. Tussen de haakjes () mogen meerdere parameters (a.k.a. argumenten) staan maar je kunt de argumentenlijst ook leeg laten. De haakjes () moet je wel altijd gebruiken om aan te geven dat het om een functie gaat.

Voorbeeld 1: een eenvoudige functie

De simpelste vorm van een functie is zonder argumenten en zonder returnwaarde:

  <?php
  
function hoi() { echo "<b>hallo</b>"; }
?>
Je kunt deze functie bijvoorbeeld zo gebruiken:

<?php


  
function hoi() { echo "<b>hallo</b>"; }
echo "Demonstratie van een simpele functie<br>"; echo "Nu roepen we de functie aan... "; hoi(); echo " ...en dat was het weer."; ?>

Zo ziet het resultaat eruit:

Demonstratie van een simpele functie
Nu roepen we de functie aan... hallo ...en dat was het weer.

Let erop dat de naam die je gebruikt om de functie aan te roepen exact hetzelfde is als de naam van de functie. Gebruik daarom bij voorkeur alleen kleine letters. Wat ook vaak gebruikt wordt is dat de eerste letter van de naam een hoofdletter is en de rest kleine letters.

Voorbeeld 2: een functie met twee argumenten

Uitrekenen van de oppervlakte van een rechthoek. Zoals je weet kun je de oppervlakte berekenen door de lengte en breedte met elkaar te vermenigvuldigen. Dat gaan we nu eens met een functie doen. Eerst zie je de functie oppervlakte() , daarna een paar verschillende manieren om de functie te gebruiken.

De functie oppervlakte() heeft twee argumenten en een return-waarde. Met een argument wordt hier bedoeld een variabele die de functie in gaat. Er wordt ook wel gezegd dat je die variabelen "aan de functie meegeeft". In deze functie zijn dat de lengte en breedte.

De return-waarde is een variabele die uit de functie komt. Er wordt ook wel gezegd dat de functie die waarde "terug geeft".


<?php

  // Hier wordt de functie oppervlakte() gemaakt
  
function oppervlakte($len,$br) { $opp= $len * $br; return $opp; }
/* * Hieronder wordt de functie oppervlakte() op * een aantal verschillende manieren gebruikt */ echo "Aanroep met getallen<br>\n"; echo "De oppervlakte van een rechthoek met lengte 4 en breedte 5 is: "; echo oppervlakte(4,5); echo "<p>"; echo "Aanroep met variabelen<br>\n"; $lengte=3; $breedte=5; echo "De oppervlakte van een rechthoek met lengte $lengte en breedte $breedte is: "; echo oppervlakte($lengte,$breedte); echo "<p>"; echo "Aanroep vanuit een loopje<br>\n"; for($lengte=1; $lengte<4; $lengte++) { for($breedte=1; $breedte<4; $breedte++) { echo "De oppervlakte van een rechthoek met lengte $lengte en breedte $breedte is: "; echo oppervlakte($lengte,$breedte); echo "<br>"; } // for breedte } // for lengte ?>
Aanroep met getallen
De oppervlakte van een rechthoek met lengte 4 en breedte 5 is: 20

Aanroep met variabelen
De oppervlakte van een rechthoek met lengte 3 en breedte 5 is: 15

Aanroep vanuit een loopje
De oppervlakte van een rechthoek met lengte 1 en breedte 1 is: 1
De oppervlakte van een rechthoek met lengte 1 en breedte 2 is: 2
De oppervlakte van een rechthoek met lengte 1 en breedte 3 is: 3
De oppervlakte van een rechthoek met lengte 2 en breedte 1 is: 2
De oppervlakte van een rechthoek met lengte 2 en breedte 2 is: 4
De oppervlakte van een rechthoek met lengte 2 en breedte 3 is: 6
De oppervlakte van een rechthoek met lengte 3 en breedte 1 is: 3
De oppervlakte van een rechthoek met lengte 3 en breedte 2 is: 6
De oppervlakte van een rechthoek met lengte 3 en breedte 3 is: 9

Voorbeeld 3

Een functie die zijn argument kwadrateert en het resultaat teruggeeft. Eerst de functie, daarna twee verschillende manieren waarop je het resultaat kunt gebruiken.

<?php
  
function kwadraat($getal) { $produkt = $getal * $getal; return $produkt; }
echo "Direkt afdrukken van het resultaat:<br>\n"; $wortel = 5; echo "Het kwadraat van $wortel is " . kwadraat($wortel) . "<p>\n"; echo "Eerst een sommetje maken en dan afdrukken van het resultaat:<br>\n"; $wortel = 7; $k = kwadraat($wortel); $resultaat = $k + 1; echo "Het kwadraat van $wortel plus 1 is " . $resultaat . "<p>\n"; ?>
Direkt afdrukken van het resultaat:
Het kwadraat van 5 is 25

Eerst een sommetje maken en dan afdrukken van het resultaat:
Het kwadraat van 7 plus 1 is 50

Je ziet hieraan een aantal dingen:

Waarden teruggeven vanuit een functie: return

Hierboven zie je dat je met het return statement een waarde kunt teruggeven naar de plaats waar de functie werd aangeroepen. Vaak wil je meerdere waarden teruggeven en soms wil je zelfs argumenten binnen de functie een andere waarde geven. Het return statement springt ook direkt uit de functie. Je kunt het dus ook gebruiken als je de functie wilt verlaten en terugkeren naar de plaats waar de functie werd aangeroepen, bijvoorbeeld wanneer je in de functie ziet dat het geen zin heeft om de rest van de functie-code te doorlopen. Je mag op meerdere plaatsen in een functie een return-statement gebruiken.

Als je argumenten opgeeft zoals in het voorbeeldje hierboven met de functie kwadraat, dan krijgt de variabele $getal binnen de functie de waarde van het argument dat je meegeeft. Wanneer we nou in de functie de waarde van $getal veranderen dan gebeurt er niks met de waarde van de variabele $wortel die in de aanroep stond omdat $getal eigenlijk een kopie is van $wortel.

Als je wilt dat $wortel wel de waarde aanneemt van het argument binnen de functie dan moet je de functie zo opschrijven:


  <?php
  
function kwadraat(&$getal) { $produkt = $getal * $getal; return $produkt; }
?>
dus met een & voor het argument. Dit noemen ze het doorgeven van een variabele 'by reference'. Je geeft namelijk niet de waarde door maar een referentie (een verwijzing) naar de waarde.

Wat er werkelijk gebeurt zie je in het volgende diagram:

Op deze manier kun je vanuit een functie meer dan 1 waarde teruggeven, zoals in het volgende voorbeeld:


<?php
  
function geef_xyz(&$x, &$y, &$z) { $x=5; $y="zes"; $z="zeven"; return 8; }
// geef de variabelen ix, ei en zet alvast een waarde $ix=0; $ei=0; $zet=0; // aanroepen van de functie geef_xyz() $resultaat=geef_xyz($ix,$ei,$zet); echo "ix : $ix<br>\n"; echo "ei : $ei<br>\n"; echo "zet : $zet<br>\n"; echo "resultaat : $resultaat<br>\n"; ?>
ix : 5
ei : zes
zet : zeven
resultaat : 8

PHP's ingebouwde functies

Ingebouwde PHP functies die wij kunnen gebruiken in onze PHP-programma's voldoen per definitie aan reden nummer 3 (zie boven), namelijk dat wij als buitenstaander de functionaliteit willen gebruiken die de PHP-ontwikkelaars gemaakt hebben maar niet altijd hoeven te weten hoe het werkt.

In dit college komen een aantal standaard PHP functies aan bod uit de volgende categorieën:


<?php
  $datum=getdate();
  echo "Het is nu $datum[hours]:$datum[minutes]";
?>
Het is nu 9:50, shit zo laat al ?