Médiaforma

All posts tagged portée

Les variables définies dans le code sont utilisables partout, hormis dans les fonctions.

<?php
  $a = 10;
  function test() {
    echo "Dans la fonction, \$a = ".$a;
  }
  echo "En dehors de la fonction, \$a = ".$a."<br>";
  test();
?>

Voici le résultat de ce code.

Comme vous pouvez le voir, la variable $a est inaccessible dans la fonction. Son utilisation provoque une erreur à l’exécution. Pour corriger ce problème, il suffit de déclarer la variable $a globale à l’intérieur de la fonction. Il est alors possible de lire, mais également de modifier la variable dans la fonction.

<?php
  $a = 10;
  function test() {
    global $a;
    echo "Dans la fonction, \$a = ".$a."<br>";
    $a = 20;
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

Exécutez ce code dans Wampserver. Comme vous pouvez le voir, la vatiable globale $a est bien accessible dans la fonction.

Il est même possible de la modifier globalement. La modification est répercutée dans tout le code, y compris en dehors de la fonction.

Une autre solution consiste à utiliser le tableau associatif $GLOBALS[] :

<?php
  $a = 10;
  function test() {
    echo "Dans la fonction, \$GLOBALS[\"a\"] = ".$GLOBALS["a"]."<br>";
    $GLOBALS["a"] = 20;
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

Voici le résultat :

Les variables définies à l’intérieur d’une fonction ont une portée limitée à cette fonction.

Examinez ce code :

<?php
  function test() {
    $a = 10;
    echo "Dans la fonction, \$a = ".$a."<br>";
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

A l’exécution, deux erreurs sont détectées : une sur la première instruction echo (car la variable $a n’est pas encore définie) et une sur la dernière instruction echo (car la variable $a n’est pas accessible en dehors de la fonction) :

Nous allons en terminer avec la portée des variables en parlant des variables statiques. La portée d’une variable statique est locale à une fonction, mais elle ne perd pas sa valeur lorsque la fonction est à nouveau appelée.

Examinez ce code :

<?php
  function test() {
    static $a = 10;
    echo "\$a = ".$a."<br>";
    $a++;
  }
  test();
  test();
  test();
  test();
?>

La variable $a est définie statique lors de son initialisation dans la fonction. Cette instruction ne sera exécutée qu’une fois. Les quatre appels de la fonction test() affichent donc successivement les valeurs 10, 11, 12 et 13 pour la variable $a :

Essayez de supprimer le mot static. Que se passe-t-il ?

Pour le savoir, exécutons ce code dans Wampserver.

Comme vous le supposiez certainement, la variable $a vaut 10 à chaque exécution de la fonction test.


Dans le langage Java, une variable est “visible” dans le bloc où elle a été déclarée.

L’exemple ci-après montre qu’une même variable peut avoir plusieurs valeurs en fonction de l’endroit où elle est utilisée.

public class Test_Visibilite{
  double x = 13.35;
  public static void main (String args[]){
    double x = 1.9;

    // Ici, la variable x a pour valeur 1.9, car elle a été
    // initialisée dans la méthode main
    System.out.println("Dans main, x vaut "+x);
  }

  void Methode1()
  {
    // Ici, x a pour valeur 13.35
    System.out.println("Dans Methode1, x vaut "+x);
  }

  double Fonction1(double x)
  {
    // Ici, x a la valeur passée à la fonction
    System.out.println("Dans Methode2, x vaut "+x);
    return(x);
  }
}

Nous allons prendre un autre exemple très parlant :

public class Test{
  public static void main (String args[]){
    int i;
    for (i=0; i<10; i++)
      int j = i;
    System.out.println(j);
  }
}

Cette application, à priori correcte, produit une erreur de compilation :

Contrairement à la variable i, la variable j a été définie à l’intérieur de l’instruction for. Son étendue est donc limitée à cette instruction. Pour régler le problème, il suffit de déplacer la déclaration de la variable j en dehors de la boucle for, comme ceci :

public class Test{
  public static void main (String args[]) {
    int i;
    int j=0;
    for (i=0; i<10; i++)
      j = i;
    System.out.println(j);
  }
}