Variabelen en functies

Het gebruik van variabelen kan nu wel verwarrend worden, als we binnen de functie én binnen het hoofdscript gebruik willen maken van variabelen met dezelfde namen.

Variabelen zijn enkel geldig in het script dat uitgevoerd wordt; zodra er naar een deelfunctie gesprongen wordt, zijn deze variabelen ontoegankelijk. Het is ook zo dat de inhoud van een variabele altijd verloren gaat als er gesprongen wordt naar een volgende pagina. Om dit probleem op te lossen maken we gebruik van globale variabelen.

Lokale en globale variabelen

Lokale variabelen

Variabelen zijn, zonder speciale declaratie, altijd local. Dit betekent dat ze niet bereikbaar zijn buiten de functie of buiten het hoofdscript. Een voorbeeld:

<?php
function lokaal(){
    $a = 10;
    print $a;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Functies</title>
</head>
<body>
<?php $a = 4; ?>
<p style="margin-bottom:0">De waarde van de lokale variabele $a:</p>
<ul style="margin-top:0">
  <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>
  <li>binnen de functie: a = <?php lokaal(); ?>,</li>
  <li>na de functie-aanroep: a = <?php print $a; ?>.</li>
</ul>
</body>
</html>

Neem bovenstaande over in, en sla op. Controleer de uitvoer. Wat zie je? .............................

Om een variabele toch bereikbaar te maken buiten deze functie maken we gebruik van het sleutelwoord global.

Globale variabelen

Onze gebruikte variabelen zijn wel beschikbaar over ons gehele script, daarom noemen we deze variabelen global. Het global maken kan wel enkel en alleen binnen de functie.

Een manier om variabelen verder beschikbaar te hebben, is het gebruik van de speciale arrayvariabele $GLOBALS.

<?php
function globaal(){
  $GLOBALS['a'] = 10;
  print $GLOBALS['a'];
}
?>
<?php $a = 4; ?>
<p style="margin-bottom:0">De waarde van de globale variabele $a:</p>
<ul style="margin-top:0">
  <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>
  <li>binnen de functie: a = <?php globaal(); ?>,</li>
  <li>na de functie-aanroep: a = <?php print $a; ?>.</li>
</ul>

En voer opnieuw uit. Wat is er gebeurd? ...........................................................................

Variabelen doorgeven via verwijzing (referentie)

Een andere manier om variabelen aan een functie door te geven is door te verwijzen naar het adres waar de variabele wordt opgeslagen. Zo wordt de variabele ook bereikbaar van buiten de functie. Om te verwijzen naar het adres van een variabele, laten we deze variabele voorafgaan door een ampersand (&). Voorbeeld:

<?php
function incrementeren(&$getal){
  $getal++;
}
?>
<?php $a = 5; ?>
<p style="margin-bottom:0">De waarde van de variabele doorgegeven via referentie $a:</p>
<ul style="margin-top:0">
  <li>voor de functie-aanroep: a = <?php print $a; ?>,</li>
  <li><?php incrementeren($a); ?>na de functie-aanroep: a = <?php print $a; ?>.</li>
</ul>

Als gebruiker van een functie moet je dus niet weten of deze functie met het adres werkt, of met de variabele zelf. Het is natuurlijk wel van belang om te weten of je originele waarde niet gewijzigd werd.

Statische variabelen

In een normale functie gaat de inhoud van variabelen verloren, zodra de functie verlaten wordt. Om deze inhoud en variabele toch te bewaren, maken we gebruik van statische variabelen.

De waarde van dergelijke variabele wordt telkens bijgehouden als de functie verlaten wordt. De variabele is echter niet toegankelijk buiten de functie!

Een voorbeeld:

<?php
function statisch(){
  static $a = 1;
  print "$a";
  $a = $a + 1;
}?>
<p style="margin-bottom:0">De waarde van de statische variabele $a:</p>
<ul style="margin-top:0">
  <li>bij de eerste functie-aanroep: a = <?php statisch(); ?>,</li>
  <li>bij de tweede functie-aanroep: a = <?php statisch(); ?>,</li>
  <li>bij de derde functie-aanroep: a = <?php statisch(); ?>.</li>
</ul>

Tik dit in, sla op, voer uit en bekijk de uitvoer. Hoe komt dit? ..............................................

Argument met een standaardwaarde

Het is ook mogelijk om een argument in een functie reeds een standaard waarde mee te geven. Dit kan het gebruik van een functie soms eenvoudiger maken:

<?php
function dessert($dessert = "rijstpap"){
  print $dessert;
  return true;
}
?>
<?php $morgen = "yoghurt"; ?>
<p style="margin-bottom:0">Standaard argumenten:</p>
<ul style="margin-top:0">
  <li>Vandaag is er <?php dessert(); ?> voor dessert.</li>
  <li>Morgen is er <?php dessert($morgen); ?> voor dessert.</li>
</ul>

Aantal argumenten opvragen

Soms wil je een functie, waarbij het exacte aantal argumenten niet vastligt. Met de functies func_num_args(), func_get_arg() en func_get_args() kunnen we hier mee overweg:

<?php
function aantalArgumenten(){
  $argumenten['aantal'] = func_num_args();
  $argumenten['twee'] = func_get_arg(1);
  $argumenten['argumenten'] = func_get_args(); 
  return $argumenten;
}
?>
<pre>Functies met een variabel aantal argumenten:
<?php print_r(aantalArgumenten('eerste', 'tweede', 'derde')); ?></pre>

Let goed op het verschil tussen func_get_arg() en func_get_args(). De eerste levert één waarde op, de tweede een array.

Bij func_get_arg() bevat de array-waarde met de index 0 het eerste argument.

Weergeven