Que fait le =&
(equals-ampersand) en PHP ?
Est-il déprécié ?
Que fait le =&
(equals-ampersand) en PHP ?
Est-il déprécié ?
Il n'est pas déprécié et il est peu probable qu'il le soit. C'est le moyen standard pour, par exemple, faire en sorte qu'une partie d'un tableau ou d'un objet reflète les modifications apportées à un autre, au lieu de copier les données existantes.
Cela s'appelle cession par référence qui, pour citer le manuel, "signifie que les deux variables finissent par pointer sur les mêmes données, et rien n'est copié nulle part" .
La seule chose qui es déprécié avec =&
c'est "assigner le résultat de new
par référence" dans PHP 5 ce qui pourrait être la source de toute confusion. new
est automatiquement assigné par référence, donc &
est redondant/déprécié en $o = &new C;
mais pas dans $o = &$c;
.
Puisque c'est difficile à rechercher, notez que =&
( équivaut à une esperluette ) est le même que = &
( équivaut à une esperluette ) et est souvent écrite de telle sorte qu'elle se heurte à l'autre variable comme $x = &$y['z'];
o $x = &$someVar
( esperluette signe dollar nom de la variable ). Exemple simplifié à partir de la documentation :
$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4
Voici un lien pratique vers un section détaillée sur Affectation par référence dans le manuel PHP . Cette page fait partie d'une série sur les références - cela vaut la peine de prendre une minute pour lire toute la série.
Note complémentaire concernant : "car il est difficile de faire des recherches" : symbolhound.com est votre ami pour ce genre de choses.
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 en ce moment. Après cela, $a = 5 ; aura également pour résultat que $b aura un 5. Cependant, le lien de référence peut être rompu par $b =& $xyz ; ou unset($b) ; à ce moment-là, $a sera la seule variable qui sait où se trouve la cellule qui contient le 5. Faites également attention au fait 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 remplace seulement le 5 par null ;
Je confirme ce que dit Don. Mais je ne dirais pas que c'est trop simpliste. Je dirais que c'est faux.
$x = &$y['z'];
a également pour effet de créer $y['z']
s'il n'existe pas, et en lui donnant la valeur suivante null
.
Cela évite les messages d'erreur que vous auriez voulu lire. Je n'ai pas encore trouvé de documentation à ce sujet ; c'est peut-être une nouveauté de la version 5.3, pour autant que je sache.
Le symbole &
est utilisé de différentes manières en PHP pour représenter les opérations avec des "références". Le manuel PHP a une section intitulée Les références expliquées que tout programmeur PHP devrait lire.
Il est important de comprendre que les références en PHP ne sont pas un type de données, comme un pointeur, mais un concept concernant le fonctionnement des variables. Il n'y a donc pas de signification unique de &
- vous ne devez pas le lire comme "faire une référence" - cela signifie simplement "quelque chose de référentiel se passe ici".
En particulier, la syntaxe $a =& $b
qui peut également s'écrire $a = &$b
représente cession par référence . Il lie deux variables ensemble, de sorte qu'elles pointent toutes deux vers le même élément de données.
Une fois que vous avez lié deux variables de cette manière, elles sont interchangeables - vous ne pouvez pas dire que "$a pointe vers $b" ou "$b pointe vers $a" :
$a =& $b;
$a = 42;
// both $a and $b will be 42
$b = 101;
// both $a and $b will be 101
Vous pouvez également lier plus de deux variables ensemble en tant que références, et là encore, le nom existant que vous utilisez dans la partie droite de l'affectation n'a pas d'importance :
$a =& $b;
$c =& $b;
$d =& $a;
$e =& $c;
// $a, $b, $c, $d, and $e now all point to the same data, interchangeably
Cependant, si vous mettez la même variable sur le fichier à gauche côté, il casse le lien existant de cette variable, et la lie à quelque chose d'autre :
$a =& $b;
// $a and $b are linked together
$a =& $c;
// $a is now linked to $c
// the value of $b doesn't change, but it is not linked to $a or $c
Pour "rompre" le lien sans créer un nouveau lien, vous pouvez utiliser el unset
mot-clé :
$a =& $b;
$c =& $a;
// $a, $b, and $c are all linked together
unset($a);
// $b and $c are still linked together, but $a is independent
J'aimerais attirer l'attention sur la sémantique et le style de code de "l'assignation par référence". La phrase d'introduction du PO laisse entrevoir une idée fausse :
Que fait l'opérateur d'affectation =& (equals-ampersand) en PHP ?
Tout d'abord, passons en revue la section dédiée de l'application Page PHP Docs pour les opérateurs d'assignation . Remarquez comment le =
vient avant le &
et que les deux symboles sont séparés. C'est parce qu'ils ne sont PAS " opérateurs combinés ". Sémantiquement, il s'agit d'" assigner " une " référence " ; ce n'est pas un " opérateur d'assignation de référence ".
Deuxièmement, regardez comment TOUS les "opérateurs combinés" sont écrits plus bas sur la page de la documentation. Le site =
est toujours le symbole le plus à droite. Il s'agit d'une distinction très importante car l'écriture du &
à gauche de la =
change la signification -- il devient un opérateur combiné ("opérateur de bit et d'affectation") au lieu d'une affectation à une référence.
Les normes de codage PSR devraient être quelque chose que tous les développeurs PHP connaissent et s'efforcent de respecter. Remarquez cette règle de PSR-12 Section 6.2 :
Tous les opérateurs binaires arithmétiques, de comparaison, d'assignation, binaires, logiques, de chaîne de caractères et de type DOIVENT être précédés et suivis d'au moins un espace.
En vertu de cette règle, il devrait toujours y avoir un espace après l'élément =
opérateur -- cela rend =&
une violation.
De plus, il existe d'autres règles qui stipulent qu'il ne doit pas y avoir d'espace entre &
et sa variable/argument/fonction/etc.
Lorsque l'opérateur de référence & est utilisé devant un argument, il ne DOIT PAS y avoir d'espace après celui-ci.
TL;DR
=
avec des espaces des deux côtés et ne jamais écrire un espace après &
.$a =& $b;
$a = &$b;
Démontré de manière cohérente/correcte : https://riptutorial.com/php/example/11991/assign-by-reference
Non démontré de manière cohérente/correcte :
@LucidKit Je n'ai pas pu laisser de commentaire avec ma suggestion de rejet d'édition. J'ai refusé la modification du lien hypertexte car le lien original fonctionne et je ne vois pas l'intérêt de le modifier. Je ne suis pas non plus intéressé par le fait de gonfler ma réponse avec une liste de liens de pages web où la syntaxe appropriée est démontrée - un seul suffit à prouver mon point de vue et je choisis celui-ci au hasard (je n'ai aucune affiliation avec ce site).
En y regardant de plus près, il semble que vous soyez l'administrateur de ce site web car la page liée a été éditée il y a quelques minutes seulement ET l'utilisateur Admin a été créé sur ce site il y a 13 jours. Cela donne l'impression que vous essayez de faire de la publicité.
Ce n'est pas parce que quelque chose a toujours été fait d'une certaine manière Cela ne veut pas dire que c'est la bonne ou la meilleure façon de faire.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Voir aussi stackoverflow.com/questions/3200009 (marqué comme duplicata de ceci)