Opérateur d'affectation de référence en PHP, = &

Réponses:

121

Il n'est pas obsolète et il est peu probable qu'il le soit. C'est le moyen standard, par exemple, de faire partie d'un tableau ou d'un objet en miroir des modifications apportées à un autre, au lieu de copier les données existantes.

C'est ce qu'on appelle l' affectation par référence , ce qui, pour citer le manuel, "signifie que les deux variables finissent par pointer vers les mêmes données et que rien n'est copié nulle part" .

La seule chose qui est obsolète avec =&est "attribuer le résultat de newpar référence" en PHP 5 , ce qui pourrait être source de confusion. newest automatiquement attribué par référence, il &est donc redondant / obsolète dans $o = &new C;, mais pas dans $o = &$c;.


Comme il est difficile de rechercher, notez que =&( est égal à esperluette ) est identique à = &( est égal à esperluette d'espace ) et est souvent écrit de telle sorte qu'il se heurte à l'autre variable comme $x = &$y['z'];ou $x = &$someVar( nom de la variable signe dollar et esperluette ). Exemple simplifié à partir de la documentation:

$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4

Voici un lien pratique vers une section détaillée sur Assign By Reference dans le manuel PHP . Cette page fait partie d'une série de références - cela vaut la peine de prendre une minute pour lire toute la série.

user56reinstatemonica8
la source
8
note latérale re: "car il est difficile de rechercher" : symbolhound.com est votre ami pour des trucs comme ça.
billynoah
1
@billynoah Wow! symbolhound est maintenant ajouté de façon permanente à ma boîte à outils.
Parapluie
26

Ce sont deux opérateurs différents. =est une affectation comme vous le savez probablement. Et &signifie que la variable doit être accédée par référence plutôt que par valeur.

Asaph
la source
60
Je suis désolé mais c'est beaucoup trop simpliste. $ a = & $ b signifie que la variable $ a fait référence à la même chose que $ b fait actuellement. Après cela, $ a = 5; entraînera également $ b ayant un 5. Cependant, le lien de référence peut être rompu par $ b = & $ xyz; ou non défini ($ b); A quel moment $ a sera la seule variable qui sait où se trouve la cellule qui contient le 5. Attention également que si vous définissez $ a en utilisant = &, vous devez utiliser = & la prochaine fois (ou unset ($ a)) pour changer le lien de référence de $ a, spécifiquement $ a = NULL; ne rompra pas le lien, il ne remplace que le 5 par nul;
Don
8
@Don: Merci pour l'élaboration. Je peux dire que vous êtes un programmeur C.
Asaph
8
J'appuie ce que dit Don. Mais je ne dirais pas que c'est beaucoup trop simpliste. Je dirais que c'est faux.
Artefacto
@Don, vous devriez vraiment poster votre commentaire comme réponse.
Adam le
7
$x = &$y['z'];

a également pour effet de créer $y['z']s'il n'existe pas, et de le définir sur null.

Cela évite les messages d'erreur que vous auriez peut-être voulu lire. Je n'ai pas encore trouvé de documentation à ce sujet; peut-être nouveau en 5.3, pour autant que je sache.

Malcanso
la source