La portée des variables
Voyons maintenant un caractère propre à beaucoup de langages de programmation fonctionnels, dits, de haut niveaux : la portée des variables.En PHP, jusqu'à présent, lorsque vous déclariez une variable dans votre script, vous aviez l'habitude d'accéder à cette variable dans tout le reste de votre page.
En effet, d'après le code suivant :
exemple1.php
<?php
$toto = 5;
// fin du script
?>
$toto est une variable qui sera accessible par votre script PHP une fois sa déclaration faite, c'est-à-dire juste après l'instruction $toto = 5.
On peut observer le même comportement lorsque l'on utilise des include.
En effet, une fois que l'on a déclaré une variable, cette variable est accessible directement dans tous les scripts que l'on inclut à notre script courant.
Exemple :
exemple2.php
<?php
$toto = 5;
include ('script.php');
?>
Ici, $toto sera accessible, c'est à dire que l'on pourra l'appeler directement (elle contiendra alors sa valeur : 5) dans le script script.php.
Vous savez également, qu'une variable déclarée dans le corps d'une fonction n'est accessible que dans le corps de cette même fonction.
Par exemple :
exemple3.php
<?php
$toto = 5;
function ma_fonction () {
echo $toto;
}
ma_fonction();
?>
Dans ce cas, l'exécution de ce code PHP n'affichera rien vu que $toto (contenu dans le code de la fonction ma_fonction()) n'a strictement aucun rapport avec la variable $toto contenu dans le script courant.
On appellera la variable $toto (celle contenue dans le code de la fonction) comme étant une variable locale à la fonction ma_fonction() (elle n'est pas globale au script).
Le mot clé global
Sachez qu'il est possible d'utiliser dans le code même de vos fonctions des variables que vous avez déclarées dans votre script courant à l'aide du mot clé global.
Reprenons notre exemple précédent :
exemple4.php
<?php
$toto = 5;
function ma_fonction () {
global $toto;
echo $toto;
}
ma_fonction();
?>
Cet exemple affichera :
5
En effet, dans ce script, nous déclarons la variable (qui était jusque là locale) $toto comme étant une variable globale du script.
PHP sait alors qu'il doit récupérer la valeur de cette variable dans le script courant.
Il n'y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction.
Vous pouvez également effectuer la même opération en utilisant le tableau associatif $_GLOBALS.
Le code suivant donnera le même résultat que le code précédent :
exemple5.php
<?php
$toto = 5;
function ma_fonction () {
echo $_GLOBALS["toto"];
}
ma_fonction();
?>
Comme vous le voyez, le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clef et les valeurs des éléments du tableau comme valeur des variables, ce qui ressemble un peu aux tableau associatifs que vous connaissez déjà comme $_POST ou $_GET qui vous permettent de récupérer la valeur des champs de vos formulaires.
Le mot clé static
Les amateurs de programmation par objets doivent bien connaître ce terme de static :)
Une variable dite static est une variable locale à une fonction mais qui a la particularité de se souvenir de sa valeur.
Prenons comme exemple le code suivant :
exemple6.php
<?php
function ma_fonction () {
$toto = 1;
echo $toto;
$toto++;
}
?>
Si je lance cette fonction 50 fois, vous allez tous penser que cette fonction affichera 50 fois la valeur 1, et vous aurez raison :)
Dans ce cas, l'incrémentation ne sert à rien puisque lorsque l'on a fini d'exécuter cette fonction PHP "perd connaissance" de la valeur de la variable $toto.
En revanche, si on déclare la variable $toto comme étant une variable statique (grâce au mot clé static), le comportement de cette fonction sera totalement différent.
En effet, vu que $toto est statique, PHP se souviendra de sa valeur lors de la dernière exécution de la fonction.
Avec le code suivant :
exemple7.php
<?php
function ma_fonction () {
static $toto = 1;
echo $toto;
$toto++;
}
?>
Si je lance 50 fois ma fonction, et bien nous verrons sur l'écran, la suite des nombres entre 1 et 50.
Explication : à chaque appel, PHP se souvient de la précédente valeur de la variable $toto (parce qu'elle est static) et notre fonction incrémente alors cette valeur pour ensuite l'afficher.
Le passage par référence
Dans nos exemples précédents, vous avez que grâce au mot clé static, les fonctions pouvaient récupérer les valeurs des variables globales.
Sachez qu'il est également possible de modifier la valeur d'une variable d'un script (une variable globale) grâce à une fonction en utilisant un passage de variable par référence.
Le passage par référence se caractérise par l'utilisation d'un & avant le nom de votre variable dans les arguments de votre fonction.
Exemple :
exemple8.php
<?php
$toto = 5;
function ma_fonction ($var) {
$var++;
}
ma_fonction(&$toto);
echo $toto;
?>
Ce script affichera :
6
Pour les personnes qui ont fait du C, le passage par référence s'assimile à la notion de pointeur.
En passant une variable par référence à une fonction, nous ne passons pas en fait la variable en elle-même (la preuve : notre fonction utilise une variable $var alors qu'elle modifie tout de même la valeur de la variable $toto du script courant) mais une référence vers la zone mémoire où est stockée la valeur de notre variable $toto.
Notre fonction modifie alors directement cette zone mémoire en lui donnant une nouvelle valeur, ce qui explique que dans le script courant, et bien la valeur de $toto a changé.