9- La portée des variables

En PHP, les variables ont une portée définie, et toute variable qui ne sera plus utilisée par le programme est ramassée par le garbage collector (programme qui tourne en fond pour libérer de l’espace mémoire en supprimant les données non utilisées).

Toutes les variables déclarées dans le programme principal sont stockées pendant tout le temps de l’exécution de ce-dernier (sauf si elles sont null).

Toutes les variables déclarées dans une fonctions ont une portée locale, c’est à dire qu’elle ne sort pas de la fonction, sauf si la variable est passé par référence dans la signature de la fonction, qu’elle est déclarée avec le mot-clé global (déprécié), statique ou qu’elle fait partie des variables d’environnement (post, get, cookie, session…).

Lors d’un appel à une fonction, les paramètres de la fonctions sont copiés, et seule leur copie est utilisée dans le corps de la fonction (sauf dans les cas cités précédemment). Ainsi, si l’on effectue des opérations sur l’un d’entre eux, la variable externe à la fonction ne sera pas modifiée.

Lors d’une boucle “for”, l’itérateur déclaré a également une portée locale. Lors d’une boucle foreach, la clé et la valeur sont également des copies à portée locale. La portée locale des itérateurs concerne tout le corps de la fonction, ainsi, si une boucle est effectuée dans une autre boucle, on peut utiliser l’itérateur de la boucle contenant dans la boucle contenue.

Néanmoins, ce n’est pas le cas pour les fonctions : si on déclare une fonction dans une autre fonction, on ne pourra pas utiliser les données de la fonction qui contient, sauf s’ils sont passés en paramètres.

Exemple :

function toto(){
   $a = 3;
   function tata(){
       echo $a; // je ne peux pas utiliser $a car hors de portée
   }
}

En résumé, il faut voir une fonction comme une boîte étanche dans laquelle on ne fait entrer des variables que par les paramètres de la fonctions, et dont on ne fait sortir des valeurs que par le mot-clé return. Cela n'est pas exact pour les objets qui sont par défaut assignés par références et non clonés (s'ils sont en paramètre d'une fonction, ils seront directement modifiés sans qu'une copie ne soit crée).