|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre habitué
![]() Inscription : septembre 2003 Messages : 598 ![]() |
Bonjour,
J'ai repris l'exemple du manuel php qui modifie les valeurs d'un tableau durant un foreach en passant la référence du tableau (&), ce qui permet de travailler sur le tableau lui-même et non pas sur sa copie. Code :
Code :
avec un foreach: Code :
Après quelques essaies il s'avère qu'en changeant le nom de la variable : Code :
Ce que je ne comprends plus c'est la portée d'une variable en PHP. Normalement $value n'est accessible que dans le 1er bloc foreach non ? Donc si je nomme ma variable $value dans le 2eme foreach il ne devrait pas y avoir de pb. Quelqu'un pourrait m'éclairer ? Merci |
||||||||
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() Développeur Web Inscription : avril 2005 Messages : 395 ![]() |
Salut, c'est un grand classique !
Code php :
Dans la dernière boucle (avec référence) la référence est gardé sur le dernier élément du tableau. On commence la seconde boucle (sans référence cette fois), On appel $value (avec valeur d'origine) mais pendant qu'on appel value on continue de modifier la référence sur le dernier élément, ce qui donne : 1er appel $value = un+zero donc la référence (du dernier indice)=> un+zero 2eme appel $value = deux+zero donc la référence (du dernier indice)=> deux+zero 3eme appel $value = deux+zero donc la référence (du dernier indice)=> deux+zero Pourquoi la référence sur $value influe sur le tableau $ar ? $value représente un indice de $arr pendant le foreach : $value = $arr[n] |
||
|
|
00
|
|
|
#3 |
|
Membre émérite
![]() Inscription : septembre 2007 Messages : 951 ![]() |
Ta question est tres interresante, ta variable $value n'est pas réinitialisée, dans la mesure ou tu utilises un passage par reference. Php conserve des informations sur cette variable meme apres la boucle. Il faut utiliser un unset($value) juste apres ton tableau pour briser la reference.
|
|
|
00
|
|
|
#4 | ||
|
Membre habitué
![]() Inscription : septembre 2003 Messages : 598 ![]() |
Merci à vous 2 pour ces trèèès précieuses informations.
Toutefois quelque chose m'inquiète. Si j'utilise un passage par référence dans une fonction par ex: Code :
nommées $value seront affectées par la référence ? |
||
|
|
00
|
|
|
#5 | ||
|
Membre éprouvé
![]() Développeur Web Inscription : avril 2005 Messages : 395 ![]() |
Les fonctions qui utilisent un paramètre par référence permettent justement de modifier une variable sans pour autant utilisé le mot clé global ou encore retourner une valeur grâce au return.
Code php :
|
||
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : septembre 2003 Messages : 598 ![]() |
Je suis bien d'accord, mais ça ne répond pas à ma question.
|
|
|
00
|
|
|
#7 | ||
|
Membre éprouvé
![]() Développeur Web Inscription : avril 2005 Messages : 395 ![]() |
pour reprendre l'exemple simple :
Code :
Non la valeur ne changera pas. |
||
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() Inscription : septembre 2003 Messages : 598 ![]() |
Non, je demande si par ex plus loin dans le code je créé une variable
nommée $value, est ce que cette variable (à l'instar du pb rencontré avec les 2 foreach) sera affecté par la référence utilisée avec l'argument $value de incrementer(&$value) ? En clair est ce que je doit faire un unset() avant d'utiliser une nouvelle variable $value ? |
|
|
00
|
|
|
#9 |
|
Membre éprouvé
![]() Développeur Web Inscription : avril 2005 Messages : 395 ![]() |
La variable sera modifier seulement si tu rappels la fonction avec cette même variable.
|
|
|
00
|
|
|
#10 |
|
Membre émérite
![]() Inscription : septembre 2007 Messages : 951 ![]() |
Non tu n'as pas besoin de faire de unset, ce cas concerne juste le foreach.
Ta valeur $value n'est visbile que dans ta fonction. |
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Inscription : septembre 2003 Messages : 598 ![]() |
D'accord ! C'est ce que je voulais savoir
Merci |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com