Maison > Article > développement back-end > Comment comprendre le symbole « & » ajouté aux fonctions personnalisées PHP ?
En PHP, le symbole & transmet une référence de variable plutôt qu'une copie. La référence signifie accéder au même contenu de variable avec des noms différents. Ce n'est pas comme les pointeurs de C, qui sont des alias de table de symboles. Notez qu'en PHP, le nom de la variable et le contenu de la variable sont différents, donc le même contenu peut avoir des noms différents. L'analogie la plus proche concerne les noms de fichiers Unix et les fichiers eux-mêmes : les noms de variables sont les entrées du répertoire et le contenu des variables est les fichiers eux-mêmes. Les références peuvent être considérées comme des connexions étroites dans le système de fichiers Unix .
Les références PHP vous permettent d'utiliser deux variables pour pointer vers le même contenu. Cela signifie que lorsque vous le faites :
<?php $a =&$b ?>
cela signifie que $a et $b pointent vers la même variable.
Remarque : $a et $b sont exactement les mêmes ici. Cela ne signifie pas que $a pointe vers $b ou vice versa, mais que $a et $b pointent vers le même endroit.
La même syntaxe peut être utilisée dans les fonctions, qui renvoient des références, et dans le nouvel opérateur (PHP 4.0.4 et versions ultérieures) :
<?php $bar =& new fooclass(); $foo =& find_var ($bar); ?>
Remarque : Ne pas utiliser l'opérateur & entraîne la génération d'une copie de l'objet. Si vous utilisez $this dans une classe, cela s'appliquera à l'instance actuelle de cette classe. L'affectation sans & copiera l'instance (par exemple un objet) et $this sera appliqué à la copie, ce qui n'est pas toujours le résultat souhaité. En raison de problèmes de performances et de consommation de mémoire, vous souhaitez généralement travailler sur une seule instance.
Bien que vous puissiez utiliser l'opérateur @ pour désactiver tout messages d'erreur dans un constructeur, par exemple avec @new, cela n'a aucun effet lors de l'utilisation d'une instruction &new. Il s'agit d'une limitation du moteur Zend et entraînera une erreur d'analyse.
La deuxième chose qu'une référence fait est de transmettre une variable par référence. Ceci est accompli en créant une variable locale dans la fonction et cette variable fait référence au même contenu dans la portée appelante. Par exemple :
<?php function foo (&$var) { $var++; } $a=5; foo ($a); ?>
changera $a en 6. En effet, dans la fonction foo, la variable $var pointe vers la même chose que $a. Voir Passage par référence pour une explication plus détaillée.
La troisième chose qu'une référence fait est le retour de référence.
Ce qu'une référence n'est pas
Comme mentionné précédemment, une référence n'est pas un pointeur. Cela signifie que la structure suivante ne produira pas l'effet escompté :
<?php function foo (&$var){ $var =& $GLOBALS["baz"]; } foo($bar); ?>
Cela entraînera la liaison de la variable $var dans la fonction foo à $bar lorsque la fonction est appelée, mais puis il est lié à $GLOBALS["baz"]. Il n'est pas possible de lier $bar à une autre variable dans la portée de l'appel de fonction via le mécanisme de référence, car il n'y a pas de variable $bar dans la fonction foo (elle est représentée par $var, mais $var n'a que le contenu de la variable et aucun appel liaison nom-valeur de la table de symboles).
Passer par référence
Vous pouvez passer une variable par référence à une fonction afin que la fonction puisse modifier la valeur de son argument. La syntaxe est la suivante :
<?php function foo (&$var) { $var++; } $a=5; foo ($a); // $a is 6 here ?>
Notez qu'il n'y a pas de symboles de référence dans l'appel de fonction - uniquement dans la définition de la fonction. La définition de la fonction à elle seule suffit pour que les paramètres soient passés correctement par référence.
Les éléments suivants peuvent être transmis par référence :
Variables, telles que foo($a)
Nouvelles instructions, telles que foo(new foobar())
Références renvoyées par des fonctions, telles que :
<?php function &bar() { $a = 5; return $a; } foo(bar()); ?>
Pour une explication détaillée, voir retour de référence.
Toute autre expression ne peut pas être transmise par référence et le résultat n'est pas défini. Par exemple, l'exemple suivant de passage par référence n'est pas valide :
<?php function bar(){ // Note the missing & $a = 5; return $a; } foo(bar()); foo($a = 5) // 表达式,不是变量 foo(5) // 常量,不是变量 ?>
Ces conditions sont disponibles dans PHP 4.0.4 et versions ultérieures.
Retour de référence
Le retour de référence est utilisé lorsque vous souhaitez utiliser une fonction pour trouver à quelle variable la référence doit être liée. Lors du renvoi d'une référence, utilisez cette syntaxe :
<?php function &find_var ($param){ /* ...code... */ return $found_var; } $foo =& find_var ($bar); $foo->x = 2; ?>
Dans ce cas, les propriétés de l'objet renvoyé par la fonction find_var seront définies (Traducteur : fait référence à $foo->x = 2 ; instruction) au lieu de copier, comme sans utiliser la syntaxe de référence.
Remarque : à la différence du passage de paramètres, l'esperluette doit être utilisée aux deux endroits ici - pour indiquer qu'une référence est renvoyée, et non une copie habituelle, et également pour indiquer que $foo est lié comme référence, pas comme affectation habituelle.
Unreference
Lorsque vous supprimez une référence, vous rompez simplement la liaison entre le nom de la variable et le contenu de la variable. Cela ne signifie pas que le contenu des variables est détruit. Par exemple :
<?php $a = 1; $b =& $a; unset ($a); ?>
ne supprimera pas $b, juste $a.
Une analogie entre ceci et l’appel de dissociation d’Unix peut aider à comprendre.
Positionnement de référence
De nombreuses structures de syntaxe PHP sont implémentées via le mécanisme de référence, donc tout ce qui précède sur la liaison de référence s'applique également à ces structures. Certaines constructions, telles que le passage par référence et le retour, ont déjà été mentionnées ci-dessus. D'autres structures qui utilisent des références sont :
référence globale
Lorsque vous déclarez une variable avec global $var, vous créez en fait une référence à la variable globale. Cela revient à faire :
<?php $var =& $GLOBALS["var"]; ?>
这意味着,例如,unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!