Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
La portée des variables en PHP
Dans cette
formation Php , nous proposons d'aborder une notion importante, celle de la
portée des variables . La durée de vie d'une variable déclarée dans une
fonction est limitée à ses bornes. Cela signifie qu'elle n'est pas connue en dehors et ne peut donc pas être exploitée. Pour continuer de porter sa valeur, il faut soit la passer en paramètre de la fonction, soit la déclarer comme une
variable globale en
PHP .
Sources et présentation de la problématique
Pour démontrer les subtilités d'exploitation des
variables en PHP et de leurs portées, nous proposons de débuter les travaux depuis une petite application. Il s'agit de celle que nous avons exploitée pour présenter les
instructions conditionnelles mais aussi les
boucles et les
fonctions . La capture ci-dessus en donne un bref aperçu. L'internaute saisit une valeur qu'il soumet en cliquant sur le
bouton Envoyer . Celle-ci transite par le serveur et est réceptionnée par un
code PHP . Ce dernier l'exploite pour réaliser un calcul itératif de multiplication.
La décompression des sources conduit au fichier de la page Web principale nommé
index.php . Il est accompagné de ses ressources externes dans les sous dossiers.
Comme nous l'avait appris notamment la
formation pour débuter en PHP , l'adresse doit être prélevée depuis l'
explorateur Windows pour référencer ce nouveau
projet Web dans
EasyPhp . C'est lui qui émule le
serveur distant et qui permet de tester et valider nos développements Web serveur.
Cliquer sur le lien du projet ainsi référencé pour accéder à la page Web : index.php ,
Taper une valeur numérique dans la zone de texte,
Puis soumettre le formulaire en cliquant sur le bouton Envoyer ,
Nous obtenons le résultat illustré par la capture ci-dessus. Comme nous l'avons déjà appris, nous venons de générer un
PostBack . Concrètement, nous avons envoyé la donnée au serveur. Un
code Php s'est chargé de la réceptionner pour réaliser le traitement itératif borné inscrit dans le calque inférieur de la page Web.
Nous proposons de le constater en accédant au code de la
page php .
A la racine du dossier de décompression, cliquer avec le bouton droit de la souris sur le fichier index.php ,
Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad ++,
Entre les lignes 43 et 48 pour un éditeur Notepad, vous notez la présence du
formulaire Html encapsulant les différents
contrôles Input .
...
<div style='float:left; width:15%; height:100px; text-align:center;'>
<div id='cadre1'>
<form id='formulaire' name='formulaire' method='post' action='index.php'>
<div style='height:30px; width:100%; font-size:14px;'><strong>Valeur seuille :</strong></div>
<div style='height:30px; width:100%;'><input type='text' id='plafond' name='plafond' value='Saisir un nb entier' onclick='this.value=vider(this.value);'/> </div>
<div style='height:40px; width:100%;'><input type='button' value='Envoyer' onClick='document.getElementById('formulaire').submit();'/> </div>
</form>
</div>
</div>
...
Les données à transmettre du client au serveur doivent en effet être intégrées dans un
formulaire . Au clic sur le
bouton Envoyer , c'est ensuite un
code Javascript qui réalise la soumission :
onClick='document.getElementById('formulaire').submit();' .
Comme nous avions développé et expliqué ces instructions dans les formations précédentes, nous choisissons ici de les récupérer pour nous concentrer sur notre problématique : La
portée des variables en Php .
A partir de la ligne 71, vous notez la
section de code PHP utilisée pour réceptionner la donnée transmise par le client, soit à la
soumission du formulaire .
<?php
if(isset($_POST['plafond']))
{
$le_plafond = $_POST['plafond'];
$restitution ='';
$i=0;
while($i<$le_plafond)
{
$restitution.= $i.'<br />';
$i++;
}
}
else
{
$le_plafond = 0;
$restitution = '';
}
?>
C'est l'
instruction Php $_POST qui permet de récupérer la valeur pour la stocker dans une variable ($le_plafond). Cette dernière est alors exploitée comme borne supérieure pour le
traitement itératif déclenché par une
boucle while (while($i<$le_plafond)). Ces
boucles ont fait l'objet d'une formation à part entière. Tant que la borne supérieure définie par la saisie de l'internaute n'est pas atteinte, la variable de boucle est incrémentée ($i++) et son résultat est affiché sur la page grâce à la
variable restitution . Elle est intégrée par concaténation dans le
calque Html en ligne 97.
...
<div class='titre_h1'>
<h1>Découverte du PHP, Bienvenue !</h1>
<h2>Traitement itératif sur : <?php echo $le_plafond; ?>passage(s)</h2>
<br /><div style='width:auto; text-align:left; font-size:18px; padding-left:30%;'>
<?php echo $restitution; ?>
</div><br />
</div>
...
Enfin, tout en bas de la page Web figure un assemblage de
code client et de
code serveur .
...
</script>
<?php
if(isset($_POST['plafond']))
{
?>
<script type='text/javascript' language='javascript'>
document.getElementById('plafond').value = <?php echo $le_plafond ?>;
</script>
<?php
}
?>
</html>
Nous l'avions bâti pour faire transiter la donnée dans l'autre sens, du serveur vers le client, afin de restituer la donnée dans la zone de saisie, réinitialisée à cause du
PostBack . Et à ce titre, nous avions démontré la simplicité d'imbrication et de communication entre les différentes sections de code.
document.getElementById('plafond').value= <?php echo $le_plafond ?>;
Modifier une variable par une fonction
L'objectif est le suivant. A chaque passage dans la
boucle , nous souhaitons appeler une fonction se chargeant d'incrémenter d'une unité supplémentaire la variable de boucle. Nous devrions donc constater un saut de deux unités à chaque passage, toujours borné par la valeur définie par l'internaute. Dans la formation précédente, nous avons appris à créer et
exploiter les fonctions en PHP .
En bas de la page Web, après le code Php existant, créer la fonction ajout , comme suit :
...
</script>
<?php
}
function ajout()
{
$i++;
return $i;
}
?>
</html>
Cette fonction primaire ne demande aucun paramètre. Elle doit incrémenter ($i++) la variable de boucle qu'elle considère dans ce cas, comme une
variable globale .
Cette fonction doit être appelée par notre traitement itératif à chaque passage. Nous proposons d'afficher côte à côte, la variable d'origine de la boucle et sa transformation suite au traitement par la
fonction ajout() .
Dans la boucle while du code de réception (ligne 81), réaliser les adaptations suivantes :
...
while($i<$le_plafond)
{
$restitution.= '('.$i.')'.ajout(). '<br/>';
$i++;
}
...
Nous plaçons donc la variable de boucle entre parenthèses concaténées pour différencier le résultat avant et après traitement. Ce traitement lui est associé par appel concaténé de la
fonction ajout .
Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
Cliquer dans sa barre d'adresse pour l'activer,
Enfoncer la touche Entrée pour recharger la page Web,
Saisir une valeur numérique, par exemple 10,
Puis, la soumettre en cliquant sur le bouton Envoyer ,
Comme vous le constatez, une erreur est générée à chaque passage dans la boucle. Nous pourrions choisir de les ignorer comme nous l'avions appris grâce à la
fonction PHP ini_set . Mais il est plus important de la gérer et de la comprendre.
La
durée de vie des variables d'une fonction est limitée à ses bornes. La
variable $i dans ce cas n'est pas considérée comme
globale . Elle est considérée comme inconnue par la fonction, d'où la présence d'erreurs. Elle est malgré tout initialisée et restituée à 1. Mais cette affectation n'est pas portée au-delà des bornes de la fonction. De fait, le compteur de la boucle d'appel n'est absolument pas affecté.
Transmettre la valeur à une fonction
L'une des solutions consiste à transmettre la variable à la fonction par ses paramètres, afin de porter sa valeur au-delà de ses bornes.
Revenir dans l'éditeur de code, en bas de page, entre les bornes de la fonction,
Modifier sa signature en lui passant un paramètre en attente, comme suit :
function ajout($i )
{
$i++;
return $i;
}
Ce paramètre n'est autre que la variable exploitée par la boucle d'appel et qui doit désormais être transmise à la fonction. Cette modification implique donc d'adapter son appel dans le
code Php de réception, afin de lui transmettre cette variable de boucle.
En ligne 81, passer la variable de boucle en paramètre de la fonction appelée :
while($i<$le_plafond)
{
$restitution.= '('.$i.')'.ajout($i ).'<br/>';
$i++;
}
Enregistrer les modifications et basculer sur la fenêtre du navigateur,
Recharger la page Web en validant sa barre d'adresse,
Saisir une valeur numérique, par exemple 10 comme précédemment pour comparer,
Puis, la soumettre en cliquant sur le bouton Envoyer ,
Comme vous le remarquez, plus aucune erreur n'est générée. La
variable est désormais connue puisqu'elle est passée en paramètre de la fonction. Mais elle n'est pas pour autant considérée comme
globale , en atteste les résultats. L'incrémentation d'une unité est bien réalisée et affichée. Mais elle n'est pas exploitée dans la boucle. Celle-ci poursuit son incrémentation d'une unité comme si de rien n'était. La durée de vie de la
variable $i transmise en paramètre est limitée aux bornes de la fonction. Bien que son incrémentation soit retournée, sa valeur n'est pas portée. La boucle d'appel n'en a pas connaissance et ne considère pas l'affectation.
Définir une variable globale en PHP
La solution consiste donc à déclarer explicitement cette variable comme une
variable globale grâce à la
déclarative global en
PHP .
Revenir dans l'éditeur de code entre les bornes de la fonction ajout ,
Supprimer la déclaration de son paramètre entre parenthèses,
Puis, ajouter la déclarative global avant l'incrémentation de la variable de boucle,
function ajout()
{
global $i;
$i++;
return $i;
}
Une fois encore, comme nous avons changé la signature de la fonction, nous devons adapter son appel dans le
code Php de réception de la donnée cliente.
En ligne 81, supprimer le paramètre lors de l'appel de la fonction ajout :
while($i<$le_plafond)
{
$restitution.= '('.$i.')'.ajout() .'<br/>';
$i++;
}
Enregistrer les modifications et basculer sur la fenêtre du navigateur,
Recharger la page Web en validant sa barre d'adresse,
Saisir le nombre 10 comme précédemment
Puis, soumettre le formulaire en cliquant sur le bouton Envoyer ,
Comme vous le remarquez, grâce à cette déclarative, nous avons réussi à porter la valeur de la variable au-delà des bornes de la fonction. Sa modification affecte directement la variable d'origine. De fait, nous obtenons une boucle incrémentée sur un pas de deux unités, sans dépasser néanmoins la valeur seuille indiquée par l'internaute dans le formulaire.
Voilà donc pour cette petite démonstration consistant à prolonger la durée de vie des variables ou à porter leurs valeurs au-delà des bornes des procédures. Nous aurons l'occasion d'exploiter ces acquis dans la poursuite de notre apprentissage du
langage PHP .