Par valeur ou par référence
Notions théoriques
En PHP, lorsqu'on passe une variable à une fonction, elle peut être passée soit par valeur, soit par référence.
Passage par valeur
C'est la méthode par défaut en PHP. Lorsqu'une variable est passée par valeur, une copie de la variable est créée à l'intérieur de la fonction. Ainsi, toute modification de cette variable à l'intérieur de la fonction ne modifie pas la variable originale.
Passage par référence
Lorsqu'une variable est passée par référence, la fonction reçoit un alias de la variable originale. Ainsi toute modification de cette variable à l'intérieur de la fonction modifie la variable originale.
Exemple pratique
function changerParValeur($var) {
$var = 20;
}
function changerParReference(&$var) {
$var = 20;
}
$test = 10;
changerParValeur($test);
print($test); // Affiche 10
changerParReference($test);
print($test); // Affiche 20
Dans cet exemple, la fonction changerParValeur
reçoit $test
par valeur,
donc la modification de $var
à l'intérieur de la fonction n'affecte pas $test
.
Par contre, changerParReference
reçoit $test
par référence,
donc la modification de $var
à l'intérieur de la fonction affecte $test
.
En PHP, contrairement au langage C, il n'y a pas de notion explicite de pointeurs comme en C.
En PHP, les variables sont automatiquement gérées par le langage, et vous n'avez pas besoin de manipuler directement les adresses mémoire comme vous le feriez en C avec les pointeurs.
Cependant, en PHP, vous pouvez utiliser des références pour obtenir un comportement similaire à celui des pointeurs en C.
Les références en PHP permettent à deux variables de faire référence à la même valeur en mémoire.
Voici un exemple :
$a = 5;
$b = &$a; // $b fait référence à $a
$b = 10;
echo $a; // Va afficher ?
Dans cet exemple, en modifiant la valeur de $b, la valeur de $a est également modifiée car $b fait référence à $a.
$a = 5;
$a = 5;
$b = &$a; // $b fait référence à $a
$a = 5;
$b = &$a; // $b fait référence à $a
$b = 10;
$a = 5;
$b = &$a; // $b fait référence à $a
$b = 10;
echo $a; // Va afficher ?
$a = 5;
$b = &$a; // $b fait réf érence à $a
$b = 10;
echo $a; // Va afficher 10
Cela peut être considéré comme une forme de pointeur en PHP, bien que ce ne soit pas aussi direct que la manipulation des adresses mémoire en C.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Gestion des scores d'un jeu
Dans ce TP, vous allez créer un script PHP qui gère les scores d'un jeu. Vous allez utiliser le passage de variables par valeur et par référence pour comprendre les différences entre les deux méthodes.
Objectifs du TP
- Comprendre le passage de variables par valeur.
- Comprendre le passage de variables par référence.
- Manipuler des tableaux associatifs.
Instructions
-
Dans votre répertoire "Documents" créez le répertoire
tp_droits_utilisateurs
. -
Dans ce répertoire créez le fichier
game_scores.php
et ajoutez le code suivant pour initialiser les scores de deux joueurs :<?php
$scores = [
"Alice" => 50,
"Bob" => 50
]; -
Ajoutez une fonction
addPointsByValue
qui prend le tableau des scores et un nombre de points à ajouter.
Par défaut en PHP, cette fonction va passer le tableau par valeur.
function addPointsByValue($scores, $points) {
foreach ($scores as $player => $score) {
$scores[$player] += $points;
}
}
- Ajoutez une fonction
addPointsByReference
qui fait la même chose, mais en passant le tableau par référence :
Cette fonction doit passer le tableau par référence (avec &$scores
au lieu de $scores
).
function addPointsByReference(&$scores, $points) {
foreach ($scores as $player => &$score) {
$score += $points;
}
}
-
Testez les deux fonctions en ajoutant 10 points à chaque joueur, d'abord avec
addPointsByValue
, puis avecaddPointsByReference
. Après chaque appel de fonction, affichez les scores pour observer les différences :// Ajout de points par valeur
addPointsByValue($scores, 10);
print_r($scores); // Les scores ne devraient pas avoir changé
// Ajout de points par référence
addPointsByReference($scores, 10);
print_r($scores); // Les scores devraient avoir augmenté de 10 -
Exécutez votre script avec la commande
php game_scores.php
et observez les résultats.Résultats attendus
- Après l'appel à
addPointsByValue
, les scores ne changent pas car le tableau est passé par valeur. - Après l'appel à
addPointsByReference
, les scores augmentent de 10 points car le tableau est passé par référence.
- Après l'appel à
Une solution
Vous devez être connecté pour voir le contenu.