formateur informatique

Portée des variables en programmation PHP

Accueil  >  Technique  >  Php  >  Php Débutant  >  Portée des variables en programmation PHP
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


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.

Calcul itératif en PHP côté serveur sur nombre transmis par formulaire client



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.

Variable publique Php non définie génère une erreur dans le code de la boucle

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,
Variable transmise à une fonction Php pour traitement mais valeur non transmise au delà des bornes

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,
Variable globale déclarée dans une fonction PHP pour porter la valeur publique dans tout le code

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.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn