La portée des variables
La "portée" d'une variable représente sa capacité à être vue et utilisée par des fonctions ou à l'extérieur des fonctions. Est-elle accessible de partout et pour tout le monde ou bien seulement à l'intérieur d'une fonction ou hors de toute fonction ? Nous avons déjà vu dans la leçon sur les variables que nous pouvons utiliser des variables sans avoir à les déclarer (sauf celles du type array et object). Le simple fait d'écrire leur nom ou de les utiliser suffit pour que l'interpréteur PHP les prennent en compte et leur attribue le bon type (en fonction de leur contenu). En fait une variable, peut être déclarée (ou simplement utilisée pour la première fois), soit à l'intérieur d'une fonction, soit en dehors de toute fonction (comme je préconise de faire). Il y a une grande différence entre les deux. En fait, il existe deux grands univers en PHP. Ce qui se passe à l'extérieur des fonctions, et ce qui se passe à l'intérieur des fonctions. La maîtrise de ces phénomènes est indispensable pour réussir vos programmes PHP. |
Si une variable est déclarée (ou simplement utilisée pour la première fois) à l'intérieur d'une fonction, elle est dite de "portée locale". C'est à dire que cette variable ne sera visible et utilisable qu'à l'intérieur de cette fonction. Pas à l'extérieur. Prenons un exemple : <?php function AffichePrenom()
{ // début de la fonction AffichePrenom AffichePrenom() ; // appel de la fonction AffichePrenom ?> Dans cet exemple, la variable $MonPrenom
est "déclarée" en l'utilisant pour la première
fois à l'intérieur de la fonction AffichePrenom().
C'est à dire entre les accolades "{"
et "}" qui définissent
la limite d'influence de la fonction (son début et sa fin). L'instruction"echo"
qui dit d'écrire quelque chose à l'écran, est aussi
à l'intérieur de la fonction. C'est donc la fonction elle
même qui affiche ce qui est à l'intérieur de sa
zone d'influence. "La variable contient la valeur Philippe" Pour vous en convaincre, cliquez ICI pour faire tourner ce programme et voir le résulta t. Maintenant, prenons le programme suivant : <?php function AffichePrenom()
{ // début de la fonction AffichePrenom echo "La variable contient la valeur $MonPrenom" ; // affiche le contenu de la variable ?> Vous avez remarqué que nous avons sorti l'instruction d'affichage à l'écran de l'intérieur de la fonction, pour la mettre à l'extérieur de la fonction, directement dans le programme, en dehors de toute zone d'influence de cette fonction. Lors de l'exécution de ce programme, le résultat à l'écran est seulement : "La variable contient la valeur" Sans plus ! Pour vous en convaincre, cliquez ICI pour faire tourner cet autre programme et voir le résultat. Tout ceci parce que la variable $MonPrenom
est déclarée ou utilisée pour la première
fois à l'intérieur d'une fonction. Ceci fait que SEULE
cette fonction, et aucune autre, ni même le programme lui même,
en dehors de cette fonction n'est plus capable de "voir" la
valeur de cette variable. On dit que la variable est purement "locale". |
Normalement, "global", veut dire de partout et pour tout le monde. Oui. Mais... Parce qu'il y a un "mais". Et nous allons voir lequel. Si vous déclarez vos variables hors de toute fonction, comme
je le préconise, ces variables et leur contenu (surtout leur
contenu, c'est ce qui nous intéresse), sont accessible de partout.
Même à l'intérieur d'une fonction. A une condition
(et de taille) : c'est qu'il faut déclarer cette variable comme
étant accessible en "global"
à l'intérieur de la fonction où vous voulez l'utiliser.
Si vous oubliez de déclarer que telle ou telle variable déclarée
en dehors de toute fonction, doit être accessible à l'intérieur
d'une fonction particulière, cette fonction ne pourra pas voir
votre variable. C'est là la cause majeure de bon nombre d'erreurs
de programmation. <?php $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ; // appel de la fonction AffichePrenom ?> Ce programme affichera à l'écran, juste la chaîne de caractères : "La variable contient la valeur" Sans plus. Cliquez ICI pour faire tourner ce petit programme et vous en convaincre. Pourquoi ? Hé bien parce que la variable ne fait pas partie de l'univers de la fonction (elle a été déclarée en dehors de celle-ci) et qu'en plus on n'a même pas dit à la fonction qu'elle devait accéder à cette variable par le mot magique "global". Pour que ça marche, il faut transformer notre programme de la manière suivante : <?php $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ; // appel de la fonction AffichePrenom ?> Cette fois, ça va marcher. Cliquez ICI pour faire tourner ce petit programme et vous en convaincre.
Remarquez la syntaxe de cette déclaration globale : le mot "global" suivi d'un espace, suivi du nom de la variable, sans oublier le ";" (point virgule) qui termine l'instruction. Bien entendu, une fois rendue accessible à l'intérieur
de la fonction par le petit mot magique "global",
la variable $MonPrenom
est devenue modifiable à l'intérieur
comme à l'extérieur de la fonction. $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable à l'extérieur de la fonction function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ;
// appel de la fonction AffichePrenom ?> Pour vous en convaincre, cliquez ICI pour faire tourner ce petit programme. Vu ? Bon ! Alors maintenant, supposons que nous n'ayons pas déclaré la variable en accès global à l'intérieur de la fonction. Juste en supprimant l'instruction correspondante dans la fonction. Notre petit programme deviendrait alors : $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable à l'extérieur de la fonction function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ;
// appel de la fonction AffichePrenom ?> Cliquez ICI pour voir ce que ça donne. Vous voyez ? La variable a deux valeurs différentes : l'une
à l'intérieur de la fonction et l'autre à l'extérieur
de la fonction.
|
Il existe encore un autre mode de gestion des variables à l'intérieur
d'une fonction. C'est ce que l'on appelle le mode "static".
Le mode "static", sert à
faire en sorte que la variable conserve sa valeur à
l'intérieur de la fonction, sans toucher à
sa valeur à l'extérieur. Et ceci, quelque
soit le nombre de fois où on fait appel à cette fonction
dans le cours de l'exécution du programme contenu dans la page
traitée par l'interpréteur PHP à un moment donné.
Vous allez comprendre (moi même, j'ai eu quelque peu de mal à
piger au début). $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable à l'extérieur de la fonction function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ;
// appel 1 de la fonction AffichePrenom ?> Cliquez ICI pour voir le résultat. Comme nous n'avons pas rendu la variable accessible à l'intérieur de la fonction par le petit mot magique "global", celle-ci (la variable) disparaît à chaque fin d'exécution de la fonction, et le résultat à l'écran est : Appel 1 : Dans la fonction, la variable $MonPrenom
contient la valeur : c'est moi Bien entendu, la valeur à l'extérieur
de la fonction n'est pas modifiée. Dans la fonction, la variable
étant considérée comme purement locale et qu'on
ne lui donne aucune valeur au début de la fonction, on ne fait
que rajouter la chaîne de caractères "c'est moi"
à du vide, ce qui donne ce que nous voyons. Jusque là,
nous avons confirmation de ce que nous savons déjà. Parfait.
Continuons. $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable à l'extérieur de la fonction function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ;
// appel 1 de la fonction AffichePrenom ?> Cliquez ICI pour voir le résultat. Le résultat est Appel 1 : Dans la fonction, la variable $MonPrenom
contient la valeur : Philippe c'est moi A chaque exécution de la fonction, la variable $MonPrenom
étant accessible de partout par tout le monde, sa valeur est
modifiée à l'intérieur comme à
l'extérieur de la fonction à chaque passage.
La première fois, on ajoute "c'est moi"
à "Philippe" (contenu initial), la
deuxième fois on rajoute encore "c'est moi",
mais comme la valeur de la variable est devenue "Philippe
c'est moi", ça donne "Philippe c'est
moi c'est moi" et ainsi de suite. Voyons maintenant ce qui se passe si nous déclarons la variable $MonPrenom en "static" à l'intérieur de la fonction. Et en l'initialisant par la même occasion à la valeur "Philippe" (toujours à l'intérieur de la fonction, dans la même instruction). Notre programme devient : $MonPrenom = "Philippe" ; // déclaration et valorisation de la variable à l'extérieur de la fonction function AffichePrenom()
{ // début de la fonction AffichePrenom } // fin de la fonction AffichePrenom AffichePrenom() ;
// appel 1 de la fonction AffichePrenom ?> Cliquez ICI pour voir ce nouveau résultat. Le résultat est : Appel 1 : Dans la fonction, la variable $MonPrenom
contient la valeur : Philippe c'est moi Où nous remarquons que tout se déroule comme précédemment, avec la différence que la valeur de la variable à l'extérieur de la fonction n'a pas bougé. Conclusion, la déclaration en "static" d'une variable à l'intérieur d'une fonction fait que la valeur de cette variable est conservée à l'intérieur de cette fonction (et uniquement à l'intérieur) tout le temps que dure l'exécution du programme traité à un moment donné par l'interpréteur PHP. La valeur de la variable à l'extérieur de la fonction, ne bouge pas.
Pratique non ? Nous verrons ce que nous pouvons faire de cette "curiosité" plus tard, certainement. |
Voici en résumé la comparaison de ces
différents modes de déclaration des variables : |
local | La variable est utilisable UNIQUEMENT à l'intérieur
d'une fonction. Sa place et sa valeur sont détruites et l'emplacement
mémoire récupéré à la fin de l'exécution
de la fonction. |
global | Nécessite de déclarer la variable par
le mot réservé "global"
à l'intérieur de la fonction. Les modifications apportées
au contenu de cette variable sont répercutées aussi bien
à l'intérieur de la fonction qu'à
l'extérieur de celle-ci. Une occurrence est automatiquement crée à l'extérieur de la fonction même si on n'a pas déclaré la variable en dehors de toute fonction. |
static | La variable n'existe qu'à l'intérieur
de la fonction. La valeur de la variable est conservée tout le
temps de l'exécution du programme à l'intérieur de
la fonction. Elle n'existe pas à l'extérieur si elle n'a
pas été déclarée en dehors de toute fonction. |
En conclusion, vous voyez qu'il est important de bien maîtriser la portée des variables si l'on veut obtenir les résultats désirés en écrivant un programme en PHP.
Ce cours est enseigné par Philippe
Médan
dans le cadre de la formation des professionnels de l'INTERNET.
au CREFAC
, 14 rue Scandicci, 93000 Pantin. Tél. : 01 48 46 51 99
au GITA-GRETA , Lycée
Technologique Diderot 61, rue David D'Angers 75019 Paris Tél. : 01
40 40 36 27
au CESI à l'Ecole
des ingénieurs, 116 Av Aristide Briand, BP 57, 92224 Bagneux CEDEX
Tél. : 01 45 36 70 00
© Philippe Médan 1999-2003. Tous droits de reproduction réservés pour tous pays.