Aller au contenu principal

La portée d'une variable

Notions théoriques

En PHP, la portée d'une variable est le contexte dans lequel elle est définie et peut être utilisée. Il existe trois types de portées : globale, locale et statique.

  • Globale : Une variable définie en dehors d'une fonction a une portée globale. Elle ne peut pas être utilisée à l'intérieur d'une fonction à moins d'être explicitement déclarée comme globale dans cette fonction.

  • Locale : Une variable définie à l'intérieur d'une fonction a une portée locale. Elle ne peut être utilisée que dans cette fonction.

  • Statique : Une variable déclarée comme statique à l'intérieur d'une fonction conserve sa valeur entre les appels de fonction.

$x = 10; // Variable globale

function test() {
$y = 20; // Variable locale
global $x; // Utilisation de la variable globale $x
static $z = 30; // Variable statique
}
Si une variable locale porte le même nom qu'une variable globale

Lorsqu'une fonction est exécutée, elle ne peut pas accéder aux variables globales à moins que celles-ci ne soient explicitement référencées en utilisant le mot-clé global (ou en utilisant l'array superglobal $GLOBALS).

Voici un exemple illustrant ce comportement :

$variable = "Je suis une variable globale";

function tester() {
$variable = "Je suis une variable locale";
echo $variable; // Cela affichera "Je suis une variable locale"
}

tester();

echo $variable; // Cela affichera "Je suis une variable globale"

Dans cet exemple, lorsqu'on appelle la fonction tester(), elle affiche la valeur de la variable locale $variable. En dehors de la fonction, l'écho affiche la valeur de la variable globale $variable.

Pour accéder à la variable globale à l'intérieur de la fonction, vous pouvez utiliser le mot-clé global :

$variable = "Je suis une variable globale";

function tester() {
global $variable;
echo $variable; // Cela affichera "Je suis une variable globale"
}

tester();

Ou vous pouvez utiliser l'array superglobal $GLOBALS qui est un tableau associatif contenant toutes les variables globales. L'index de ce tableau est le nom des variables :

$variable = "Je suis une variable globale";

function tester() {
echo $GLOBALS['variable']; // Cela affichera "Je suis une variable globale"
}

tester();
attention

L'utilisation de variables globales peut rendre le code difficile à lire et à maintenir. Il est souvent préférable de passer des variables aux fonctions en tant qu'arguments pour éviter d'avoir à dépendre de l'état global.

Exemple pratique

  • Dans votre répertoire "Documents" créez le répertoire tp_portee_variable.
  • Dans ce répertoire créez le fichier main.php :
    <?php
    // Portée d'une variable
    print("Démarrage de l'exemple \n\n");
  • Testez le fonctionnement de ce fichier :
    php main.php

Voyons comment fonctionne la portée des variables en PHP avec un exemple.

$x = 10; // Variable globale

function test() {
print("Appel de la fonction test \n\n");

global $x; // Utilisation de la variable globale $x
$y = 20; // Variable locale
static $z = 30; // Variable statique

print("x = $x \n"); // Affiche 10
print("y = $y \n"); // Affiche 20
print("z = $z \n"); // Affiche 30

print("Incremente la variable globale x \n");
$x++;

print("Incremente la variable locale y \n");
$y++;

print("Incremente la variable statique z \n\n");
$z++;
}

test(); // Appel de la fonction test
test(); // Appel de la fonction test

Dans cet exemple :

  • la variable globale $x est définie en dehors de la fonction test et peut être utilisée partout

    elle conserve donc sa valeur entre les appels de la fonction test

  • la variable locale $y est définie à l'intérieur de la fonction test et peut être utilisée seulement dans cette fonction

    elle réinitialise donc sa valeur à chaque appel de la fonction test

  • la variable statique $z est définie de façon statique à l'intérieur de la fonction test

    elle conserve sa valeur entre les appels de la fonction test

Risques des variables globales en PHP

L'utilisation excessive de variables globales en PHP peut présenter plusieurs risques et inconvénients.

Les variables globales sont accessibles de n'importe où dans le code, ce qui peut rendre le suivi des modifications et des erreurs difficile.

Voici quelques risques associés à une utilisation excessive de variables globales en PHP :

  1. Complexité et lisibilité du code : Trop de variables globales peuvent rendre le code confus, complexe et difficile à comprendre, ce qui peut entraîner des erreurs et des bugs.

  2. Dépendance accrue : L'utilisation excessive de variables globales crée une dépendance entre différentes parties du code, ce qui rend le code moins modulaire et plus difficile à maintenir.

  3. Conflits potentiels : Lorsque plusieurs parties du code modifient les mêmes variables globales, des conflits peuvent survenir, ce qui peut entraîner des résultats inattendus et des bogues difficiles à diagnostiquer.

  4. Sécurité : Les variables globales sont accessibles de partout, ce qui peut poser des problèmes de sécurité en exposant des données sensibles à des parties non autorisées du code.

  5. Testabilité : Les variables globales rendent le code plus difficile à tester, car elles introduisent des dépendances cachées qui peuvent rendre les tests unitaires plus complexes.

Pour éviter ces risques, il est recommandé de limiter l'utilisation des variables globales en PHP en les remplaçant par des méthodes plus sûres et plus structurées, telles que :

  • les paramètres de fonction,
  • les classes
  • et les espaces de noms.

Cela rendra le code plus modulaire, plus lisible, plus sûr et plus facile à maintenir.

Test de mémorisation/compréhension


Qu'est-ce qu'une variable globale en PHP ?


Qu'est-ce qu'une variable locale en PHP ?


Qu'est-ce qu'une variable statique en PHP ?



Exercice

Dans cet exercice, nous allons explorer davantage la portée des variables en PHP. Vous allez travailler avec deux variables qui portent le même nom mais qui ont une portée différente. Le but est de comprendre comment la portée des variables peut affecter leur valeur et leur comportement.

  • Dans votre répertoire "Documents" créez le répertoire tp_changer_valeur.
  • Dans ce répertoire créez le fichier main.php :
    <?php
    // Changer la valeur d'une variable
    print("Changer la valeur d'une variable \n\n");
  • Testez le fonctionnement de ce fichier :
    php main.php


  1. Créez une variable $x à l'extérieur d'une fonction et attribuez-lui la valeur 10.
  2. Créez une fonction changerValeur qui déclare une variable $x avec la valeur 20.
  3. À l'intérieur de la fonction changerValeur, affichez la valeur de $x.
  4. Après avoir appelé changerValeur, affichez la valeur de $x.
  5. À l'intérieur de changerValeur, essayez d'afficher la valeur de $x déclarée à l'extérieur de la fonction en utilisant le mot-clé global.
Corrigé de l'exercice
$x = 10;

function changerValeur() {
$x = 20;
print($x); // Affiche 20

global $x;
print($x); // Affiche 10
}

changerValeur();
print($x); // Affiche 10

Dans cet exemple, la fonction changerValeur déclare une variable $x et lui attribue une nouvelle valeur, mais cela n'affecte pas la valeur de la variable $x déclarée à l'extérieur de la fonction.

C'est parce que la variable $x à l'intérieur de la fonction a une portée locale. Elle n'est pas la même que la variable $x à l'extérieur de la fonction, qui a une portée globale.

Bien que ces 2 variables $x portent le même nom, elles ont une portée différente.

Cependant, en utilisant le mot-clé global, nous pouvons accéder à la variable $x globale à l'intérieur de la fonction.

TP pour réfléchir et résoudre des problèmes

Dans ce TP, vous allez créer un script PHP qui gère les droits d'accès à des fichiers sur un serveur. Vous allez simuler cette gestion en utilisant des variables et des fonctions.

Les droits appliqués aux fichiers seront mémorisés dans une variable globale $fichiers.

  • Dans votre répertoire "Documents" créez le répertoire tp_modifier_droits_fichiers.
  • Dans ce répertoire créez le fichier main.php :
    <?php
    // Modifier les droits d'un fichier
    print("Modifier les droits d'un fichier \n\n");
  • Testez le fonctionnement de ce fichier :
    php main.php
  1. Créez une variable globale $fichiers qui est un tableau associatif. Les clés sont les noms des fichiers et les valeurs sont les droits d'accès à ces fichiers. Par exemple :
$fichiers = ["document.txt" => "rwxr--r--", "script.php" => "rwxr-xr-x"];
  1. Créez une fonction changerDroit qui prend en paramètre le nom d'un fichier et un nouveau droit. Cette fonction change les droits du fichier dans le tableau $fichiers.

  2. Affichez les droits des fichiers, AVANT la modification des droits.

  3. Utilisez la fonction changerDroit pour changer les droits du fichier "document.txt" en "rwxr-xr-x".

  4. Affichez les droits des fichiers, APRES la modification des droits.

Une solution