Aller au contenu principal

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.

remarque

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


Quelle est la méthode par défaut de passage de variables en PHP ?


Qu'arrive-t-il à la variable originale quand une fonction la reçoit par valeur et la modifie ?


Comment une fonction peut-elle recevoir une variable par référence ?


Qu'arrive-t-il à la variable originale quand une fonction la reçoit par référence et la modifie ?


Qu'est-ce qu'un alias dans le contexte du passage par référence ?



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

  1. Dans votre répertoire "Documents" créez le répertoire tp_droits_utilisateurs.

  2. 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
    ];
  3. Ajoutez une fonction addPointsByValue qui prend le tableau des scores et un nombre de points à ajouter.

info

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;
}
}
  1. Ajoutez une fonction addPointsByReference qui fait la même chose, mais en passant le tableau par référence :
attention

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;
}
}
  1. Testez les deux fonctions en ajoutant 10 points à chaque joueur, d'abord avec addPointsByValue, puis avec addPointsByReference. 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
  2. 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.
Une solution