IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Portée d'une variable ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut [Tableaux] Portée d'une variable ?
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $arr = array(1, 2, 3, 4);
     
    foreach($arr as &$value)
      $value = $value * 2;
    avec un print_r($arr) j'ai bien les résultats attendus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
    mais là où ça me perturbe c'est lorsque je liste le tableau
    avec un foreach:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach($arr as $value) 
        echo $value." ";
    cela donne:

    Après quelques essaies il s'avère qu'en changeant le nom de
    la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach($arr as $val) 
        echo $val." ";
    ça fonctionne.

    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

  2. #2
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    Salut, c'est un grand classique !

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    $arr = array('un', 'deux', 'trois');
    foreach($arr as &$value)
      $value = $value.'+zero';
     
    print_r($arr);
    /*Array
    (
        [0] => un+zero
        [1] => deux+zero
        [2] => trois+zero
    )*/
     
    foreach($arr as $value)
    {
     
    }
    print_r($arr);
    /*Array
    (
        [0] => un+zero
        [1] => deux+zero
        [2] => deux+zero
    )*/
    L'explication :
    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]

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    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.

  4. #4
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function incrementer(&$value)
    {
      $value = $value + 1;
    }
    Est ce que cela signifie que dans le code toute les variables ultérieures
    nommées $value seront affectées par la référence ?

  5. #5
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function incrementer(&$value)
    {
      $value++;
    }
     
    $i= 0;
    incrementer($i);
    echo $i; // 1

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Je suis bien d'accord, mais ça ne répond pas à ma question.

  7. #7
    Membre chevronné
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Par défaut
    pour reprendre l'exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function incrementer(&$value)
    {
      $value++;
    }
     
    $i= 0;
    echo $i; // 0
    incrementer($i);
    echo $i; //
    Si je comprends bien ta question tu demandes si la valeur de $i avant l'appel de la fonction changera.
    Non la valeur ne changera pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Lecture d'une variable contenant plusieurs arrays
    Par MightyDucks dans le forum Langage
    Réponses: 10
    Dernier message: 27/03/2006, 12h40
  2. Réponses: 4
    Dernier message: 16/02/2006, 10h40
  3. Réponses: 2
    Dernier message: 09/02/2006, 19h06
  4. Portée d'une variable globale
    Par Giill dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/12/2005, 10h13
  5. [Tableaux] action sur une variable ->
    Par mactech dans le forum Langage
    Réponses: 9
    Dernier message: 15/12/2005, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo