Les variables PHP sont-elles passées par valeur ou par référence?
php
variables
pass-by-reference
pass-by-value
cmcculloh
la source
la source
Réponses:
C'est en valeur selon la documentation PHP .
la source
$str = add_some_extra($str);
si je n'utilisais pas la référence, non? alors quelle est la vraie valeur ajoutée de cela?$str
serait affectée null, dans votre cas.En PHP, par défaut, les objets sont passés en tant que copie de référence à un nouvel objet.
Voir cet exemple .............
Maintenant, voyez ceci ..............
Maintenant, voyez ceci ..............
j'espère que vous pouvez comprendre cela.
la source
$y
n'est pas nécessaire - il n'y a rienfunction changeValue
qui exige qu'il soit à l'intérieurclass Y
, de sorte que s'emmêle deux concepts sans rapport. Je voudrais passerfunction changeValue
à la portée extérieure, juste au-dessus$x = new X();
. Supprimez toutes les références à$y
. Il est maintenant plus facile de voir que les deux premiers exemples laissent $ x seul, et le troisième change son contenu ennew Y()
. Ce qui serait plus facile de voir si vous pratiqué le dumpingtype
de$x
- le fait que les deuxX
etY
arriver à inclure un$abc
champ est également sans rapport avec ce qui est démontréIl semble que beaucoup de gens soient confus par la façon dont les objets sont passés aux fonctions et par ce qui passe par référence. Les variables d'objets sont toujours passées par valeur, c'est juste la valeur qui est passée en PHP5 qui est un handle de référence. Comme preuve:
Les sorties:
Passer par référence signifie que nous pouvons modifier les variables qui sont vues par l'appelant. Ce que le code ci-dessus ne fait clairement pas. Nous devons changer la fonction de swap pour:
Les sorties:
afin de passer par référence.
la source
swap
fonction; en d'autres termes, si les objets étaient "passés par valeur". D'un autre côté, c'est aussi exactement ce à quoi vous vous attendriez si un descripteur d'objet était passé à la fonction, ce qui se passe en fait. Votre code ne fait pas de distinction entre ces deux cas.http://www.php.net/manual/en/migration5.oop.php
la source
Les variables PHP sont attribuées par valeur, transmises aux fonctions par valeur, et lorsqu'elles contiennent / représentent des objets, elles sont transmises par référence. Vous pouvez forcer les variables à passer par référence en utilisant un &
Attribué par valeur / exemple de référence:
sortirait
Passé par valeur / référence exampe:
produirait:
Variables d'objets passées par référence exampe:
Produirait:
(ce dernier exemple pourrait être mieux probablement ...)
la source
$foo
est un pointeur sur un objet .$foo
est passé par valeur à la fonctionchangeFoo()
, car ilchangeFoo()
n'a pas déclaré son paramètre avec a&
.Vous pouvez passer une variable à une fonction par référence. Cette fonction pourra modifier la variable d'origine.
Vous pouvez définir le passage par référence dans la définition de fonction:
la source
Vous pouvez le faire de toute façon.
mettez un symbole «&» devant et la variable que vous passez devient une seule et même chose que son origine. c'est à dire: vous pouvez passer par référence, plutôt que d'en faire une copie.
alors
la source
Les variables contenant des types primitifs sont passées par valeur en PHP5. Les variables contenant des objets sont passées par référence. Il y a un article assez intéressant du Linux Journal de 2006 qui mentionne cela et d'autres différences OO entre 4 et 5.
http://www.linuxjournal.com/article/9170
la source
&
.Les objets sont passés par référence en PHP 5 et par valeur en PHP 4. Les variables sont passées par valeur par défaut!
Lisez ici: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
la source
&
.&
devant les paramètres dans la définition - s'ils étaient passés par valeur, l'objet contenu dans la portée qui appelait la fonction avec lui comme paramètre le ferait pas être affecté.Les attributs sont toujours modifiables lorsqu'ils ne sont pas transmis par référence, donc méfiez-vous.
Production:
SwapObjects: b, a SwapValues: a, b
la source
Pour tous ceux qui rencontreront cela à l'avenir, je veux partager ce joyau des documents PHP, publié par un utilisateur anonyme :
Et voici l'exemple qu'ils fournissent:
J'ai écrit un article de blog détaillé et détaillé sur ce sujet pour JavaScript , mais je pense qu'il s'applique tout aussi bien à PHP, C ++ et à tout autre langage où les gens semblent confus au sujet du passage par valeur par rapport au passage par référence.
De toute évidence, PHP, comme C ++, est un langage qui prend en charge le passage par référence. Par défaut, les objets sont passés par valeur. Lorsque vous travaillez avec des variables qui stockent des objets, il est utile de voir ces variables comme des pointeurs (car c'est fondamentalement ce qu'elles sont, au niveau de l'assemblage). Si vous passez un pointeur par valeur, vous pouvez toujours "tracer" le pointeur et modifier les propriétés de l'objet pointé. Ce que vous ne pouvez pas faire, c'est qu'il pointe vers un autre objet. Ce n'est que si vous déclarez explicitement qu'un paramètre est passé par référence que vous pourrez le faire.
la source
En fait, les deux méthodes sont valides, mais cela dépend de vos besoins. Les valeurs de référence par référence ralentissent souvent votre script. Il est donc préférable de passer les variables par valeur en considérant le temps d'exécution. Le flux de code est également plus cohérent lorsque vous transmettez des variables par valeur.
la source
Utilisez-le pour les fonctions lorsque vous souhaitez simplement modifier la variable d'origine et lui redonner le même nom de variable avec sa nouvelle valeur affectée.
la source
Dépend de la version, 4 est par valeur, 5 est par référence.
la source