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();
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 fonctiontest
et peut être utilisée partoutelle conserve donc sa valeur entre les appels de la fonction
test
-
la variable locale
$y
est définie à l'intérieur de la fonctiontest
et peut être utilisée seulement dans cette fonctionelle 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 fonctiontest
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 :
-
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.
-
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.
-
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.
-
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.
-
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
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
- Créez une variable
$x
à l'extérieur d'une fonction et attribuez-lui la valeur 10. - Créez une fonction
changerValeur
qui déclare une variable$x
avec la valeur 20. - À l'intérieur de la fonction
changerValeur
, affichez la valeur de$x
. - Après avoir appelé
changerValeur
, affichez la valeur de$x
. - À 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
- 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"];
-
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
. -
Affichez les droits des fichiers, AVANT la modification des droits.
-
Utilisez la fonction
changerDroit
pour changer les droits du fichier "document.txt" en "rwxr-xr-x". -
Affichez les droits des fichiers, APRES la modification des droits.
Une solution
Vous devez être connecté pour voir le contenu.