PHP Passer par référence


Exemple

Cela vous permet de passer une variable par référence à une fonction ou à un élément qui vous permet de modifier la variable d'origine.

Le passage par référence n'est pas limité aux variables uniquement, les éléments suivants peuvent également être transmis par référence:

  • Nouvelles instructions, par exemple foo(new SomeClass)
  • Références renvoyées par les fonctions

Tableaux

Une utilisation courante de "passer par référence" consiste à modifier les valeurs initiales dans un tableau sans aller jusqu'à créer de nouveaux tableaux ou à jeter des déchets dans votre espace de noms. Passer par référence est aussi simple que précéder / préfixer la variable avec un & => &$myElement .

Vous trouverez ci-dessous un exemple d’exploitation d’un élément d’un tableau et d’ajout de 1 à sa valeur initiale.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

Maintenant, lorsque vous utilisez un élément dans $arr , l'élément d'origine sera mis à jour à mesure que la référence augmentera. Vous pouvez le vérifier en:

print_r($arr);

Remarque

Vous devriez prendre note lorsque vous utilisez le renvoi par référence dans les boucles. À la fin de la boucle ci-dessus, $num contient toujours une référence au dernier élément du tableau. L'attribuer post-boucle finira par manipuler le dernier élément du tableau! Vous pouvez vous assurer que cela ne se produit pas en le unset() en post-boucle:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Ce qui précède garantira que vous ne rencontrez aucun problème. Un exemple de problèmes pouvant en découler est présent dans cette question sur StackOverflow .


Les fonctions

Un autre usage courant du passage par référence se trouve dans les fonctions. La modification de la variable d'origine est aussi simple que:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Ce qui peut être vérifié en faisant echo la variable d'origine.

echo $var;

Il existe diverses restrictions concernant les fonctions, comme indiqué ci-dessous dans les documents PHP:

Remarque: il n'y a pas de signe de référence sur un appel de fonction - uniquement sur les définitions de fonction. Les définitions de fonctions seules suffisent pour transmettre correctement l'argument par référence. À partir de PHP 5.3.0, vous recevrez un avertissement indiquant que "call-time pass-by-reference" est obsolète lorsque vous utilisez & in foo (& $ a) ;. Et à partir de PHP 5.4.0, le temps de référence référence à l’heure d’appel a été supprimé, ce qui entraîne une erreur fatale.