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 :

reference, globale et fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut reference, globale et fonction
    Bonjour

    j'ai mis les pieds dans les references, et transmission de variables.

    L'idée c'est de partir d'une meme fonction et de transmettre les variables de 4 manieres differentes, reference de valeur, reference de fonction, globale, simple return.

    Mais je suis pas vraiement sur d'avoir tout compris de ce qu'il se passe reelement.

    donc voila ce que j'ai fait, j'ai commenté ce que je crois avoir compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //passer une variable par reference (&)
    function incrementer2(&$valeur)//$valeur devient reference de $a, donc $valeur devient $a.
      {
      $valeur = $valeur + 1;// équivaut à $a=$a+1, $valeur reste sur une portée locale.
      }
    $a = 1;
    incrementer2($a);
    echo $a."<br />"; // affiche "2"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // sans reference avec un return
    function incrementer3($valeur)//$valeur recupere la valeur de $a soit 1
      {
      $valeur = $valeur + 1; // equivaut à $valeur = $valeur + 1
      return $valeur;
      }
    $a = 1;
    $a = incrementer3($a);// soit $a = le retour de la valeur de $valeur, 
    echo $a."<br />"; // affiche "2", $valeur reste locale.

    Bon alors les suivantes franchement je sais pas comment les prendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // retour de variable par reference
    function &incrementer5($valeur)//
      {
      $valeur = $valeur + 1; // 
      return $valeur;
      }
    $a = 1;
    $a = &incrementer5($a);//
    echo $a."<br />"; //
    oui oui c'est exactement la meme que sans &, mais je vois pas comment ca peut fonctionner autrement, help !

    et euh pour la globale mon echec est total, l'ex suivant ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // avec une globale march epas
    function incrementer4($valeur)//
      {
      global $valeur;
      $valeur = $valeur + 1; // 
      }
    $a = 1;
    incrementer4($a);//
    $a=$valeur;
    echo $a."<br />"; //

    voila , c'est le brouillard total, on se croirait sur la tamise

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    Bonjour,

    pour "Incrementer4" avec la variable globale : Utiliser une variable globale te permet de la transmettre à la fonction sans utiliser de paramètre.
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function incrementer4($valeur)//Pas de paramètre à passer
      {
      global $a;
      $a = $a + 1; // 
      }
    $a = 1;
    incrementer4();//
    echo $a."<br />"; // $a = 2
    Pour "incrementer5", l'exemple n'est pas très explicite sur le retour par référence. En gros tu fais pointer $a sur la valeur de la variable $valeur plutôt que copier le contenu de $valeur dans $a.
    Je ne sais pas si je suis très clair, en gros tu peux oublier cette forme ci pour le moment car elle ne te serviras (presque) jamais.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    Citation Envoyé par dewsz
    pour "Incrementer4" avec la variable globale : Utiliser une variable globale te permet de la transmettre à la fonction sans utiliser de paramètre.
    donc du coup la variable $valeur ne sert plus a rien? on peut juste mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function incrementer4()//Plus de $valeur!?
      {
      global $a;
      $a = $a + 1; // 
      }
    $a = 1;
    incrementer4();//
    echo $a."<br />"; // $a = 2
    c'est marrant comme methode


    Citation Envoyé par dewsz
    En gros tu fais pointer $a sur la valeur de la variable $valeur plutôt que copier le contenu de $valeur dans $a.
    mais euh ca je croyais que c'etait la difference entre incrementer2() et incrementer3() :

    Citation Envoyé par eilijah
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function incrementer2(&$valeur)//$valeur devient reference de $a, donc $valeur devient $a.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function incrementer3($valeur)//$valeur recupere la valeur de $a soit 1

    j'ai encore du tout comprendre de travers ):

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    incrementer4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    donc du coup la variable $valeur ne sert plus a rien?
    Tout à fait, d'ailleurs tu as bien corrigé en enlevant le paramètre $valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c'est marrant comme methode
    Oui mais c'est tout de même à éviter si tu veux avoir un code lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mais euh ca je croyais que c'etait la difference entre incrementer2() et incrementer3()  :
    dans incrementer3, tu passe la valeur par copie : $valeur prend la valeur de $a,
    par contre ce sont deux variables indépendantes.
    dans incrementer2: c'est comme deux noms différents pour une même variable (un alias)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    Alors ca c'est carrement limpide comme réponse.

    quand tu dis "c'est comme deux noms différents pour une même variable", c'est vraiement ce qu'il se passe ou bien tu dis ca pour simplifier?
    je dis ca par rapport a unset() parce que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $b=15;
    $a=&$b;
    unset($a);
    echo $b;// renvoi 15
    donc est ce que unset va juste detruire le nom $a de la variable ou est ce qu'il y a 2 variables synchronisées (si l'une change l'autre aussi)? et a ce moment la unset detruirait l'une et pas l'autre ?
    j'aurais tendance a penser pour la seconde solution mais j'avoue que ton explication a le merite d'etre ultra clairs et simple.


    Pour "incrementer5", l'exemple n'est pas très explicite sur le retour par référence. En gros tu fais pointer $a sur la valeur de la variable $valeur plutôt que copier le contenu de $valeur dans $a.
    si je comprend bien ce que tu dis c'est que $a devient un alias de la variable résultat de la fonction ? ce qui parait logique et qui en effet montre le total hors sujet de cette fonction
    Quelqu'un aurait il une illustration d'une fonction ou ce serai utile? parceque dans le tuto il donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function &puissance($nombre, $exposant = 2)
      {
      return pow($nombre, $exposant);
      }
    $a =& puissance(3);
    $b =& puissance(2, 3);
    echo $a."<br />".$b."<br />"; //affiche 9 8
    mais si on enleve les & ca change strictement rien :/


    merci en tous les cas pour ta reponse dewsz!

  6. #6
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Par défaut
    quand tu dis "c'est comme deux noms différents pour une même variable", c'est vraiement ce qu'il se passe ou bien tu dis ca pour simplifier?
    je dis ca par rapport a unset() parce que :
    C'est "presque" deux nom pour une même variable. Ou plus précisément deux variables pointant sur la même zone mémoire.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $b=15;  //le contenu int(15) est situé dans la zone mémoire 0x12aa23
                // $b pointe vers la zone 0x12aa23 (donc 15)
    $a=&$b; //$a pointe vers la même zone que $b, $a pointe donc vers 0x12aa23
                // contenant la valeur int(15)
    unset($a); //$a pointe sur rien, mais la zone 0x12aa23 existe tjrs puisque
                   // référencé par $b
    echo $b;// renvoi 15
     
    echo $a; //renvoie 0 (normalement)
                //$a est maintenant une nouvelle variable pointant sur sa propre
               //zone mémoire exemple 0x5f6614
     
    unset($b) //la zone mémoire 0x12aa23 est marqué inutilisée, car aucune variable
                  //ne pointe vers elle
    donc est ce que unset va juste detruire le nom $a de la variable ou est ce qu'il y a 2 variables synchronisées (si l'une change l'autre aussi)? et a ce moment la unset detruirait l'une et pas l'autre ?
    j'aurais tendance a penser pour la seconde solution mais j'avoue que ton explication a le merite d'etre ultra clairs et simple.
    unset ne détruit que le pointeur, pas directement la valeur.
    Si tu as deux routes menant à ta maison, si tu supprime une route, tu as toujours l'autre pour y acceder. Tu peux aussi avoir autant de route que tu veux tu n'aurais toujours qu'une maison .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function &puissance($nombre, $exposant = 2)
      {
      return pow($nombre, $exposant);
      }
    $a =& puissance(3);
    $b =& puissance(2, 3);
    echo $a."<br />".$b."<br />"; //affiche 9 8
    mais si on enleve les & ca change strictement rien :/
    Effectivement l'exemple me parait inutile dans ce cas là.

    L'interêt de retourner une fonction par référence est surtout pour les objets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function &getNewObject()
    {
      $myObjet = new MyClass();
     
      return $myObjet;
    }
     
    $monObjet = getNewObject();
    dans ce cas la $monClasse pointe sur l'objet crée dans la fonction (plutôt que de faire une copie de cette objet.
    Mais depuis PHP5 les objets sont automatiquement passés par référence, donc le "&" ici est superflue.

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

Discussions similaires

  1. Variable globale et fonctions
    Par Joratois dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/01/2009, 22h30
  2. variable globale et fonctions du fichier views
    Par jtadjo dans le forum Django
    Réponses: 1
    Dernier message: 03/03/2008, 12h38
  3. Réponses: 1
    Dernier message: 04/02/2008, 21h35
  4. appliquer globalement une fonction
    Par pierrecarray dans le forum MATLAB
    Réponses: 3
    Dernier message: 09/06/2007, 21h41
  5. references et objets fonctions
    Par Yoxoman dans le forum C++
    Réponses: 4
    Dernier message: 08/02/2006, 07h26

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