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

  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.

  7. #7
    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
    Bonsoir dewsz!


    ok je crois que j'ai compris donc une varialbe est en fait un pointeur qui donne l'adresse d'une zone memoire!
    par curiosité :
    la zone mémoire 0x12aa23 est marqué inutilisée, car aucune variable ne pointe vers elle
    est ce que php va du coup automatiquement reattribuer cette zone? ou bien la zone continuera de stocker les infos jusqu'a la fin du script?


    sinon pour ton exemple vu que j'ai pas trop touché a la poo pour le moment ( j'ai de vague souvenir) et que la $monclasse que tu cites n'existe pas j'hypothetise:

    (petit rappel de ton code: )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function &getNewObject()
    {
      $myObjet = new MyClass();
     
      return $myObjet;
    }
     
    $monObjet = getNewObject();
    La fonction &getNewObject() affecte $myObject à la classe MyClass() et retourne donc un nouvel objet de MyClass() vide.

    Du coup on aurait $monObjet qui pointerait vers la valeur de $myObjet soit un objet vide de la classe MyClass() ?
    quel interet par rapport a une fonction sans le &?
    sans le & on recupere que la valeur vide et pas l'appartenance a la classe?

    sinon pour la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $monObjet = getNewObject();   
    // devrait pas etre plutot :
    $monObjet = &getNewObject();

    merci pour tes reponses et chapeau pour la clareté encore une fois

  8. #8
    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
    ok je crois que j'ai compris donc une varialbe est en fait un pointeur qui donne l'adresse d'une zone memoire!
    Oui, c'est ça.

    est ce que php va du coup automatiquement reattribuer cette zone? ou bien la zone continuera de stocker les infos jusqu'a la fin du script?
    Une fois la zone marqué libre, elle peut être réattribuée en fonction des besoins du programme. La mémoire ça coûte cher

    Du coup on aurait $monObjet qui pointerait vers la valeur de $myObjet soit un objet vide de la classe MyClass() ?
    Que veux tu dire par un objet vide?

    Du coup on aurait $monObjet qui pointerait vers la valeur de $myObjet?
    Oui les deux pointent sur le même objet.

    sans le & on recupere que la valeur vide et pas l'appartenance a la classe?
    Qand on retourne un objet ou que l'on passe un objet en paramètre, c'est obligatoirement par référence (le & est implicite)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $monObjet = getNewObject();   
    // devrait pas etre plutot :
    $monObjet = &getNewObject();
    Les deux syntaxte ont le même comportement dans le cas d'un objet retourné, car le & est implicite

  9. #9
    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
    Que veux tu dire par un objet vide?
    je voulais dire une variable vide, vu que $myObjet n'a de valeur affectée

    Citation Envoyé par dewsz
    Citation Envoyé par eilijah
    sans le & on recupere que la valeur vide et pas l'appartenance a la classe?
    Qand on retourne un objet ou que l'on passe un objet en paramètre, c'est obligatoirement par référence (le & est implicite)
    euh ca signifie que si je fais la meme fonction sans & :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function getNewObject()
    {
      $myObjet = new MyClass();
     
      return $myObjet;
    }
     
    $monObjet = getNewObject();

    ca change rien?
    Php verrait implicitement un & devant getNewObject() ?
    mais alors quel interet de mettre ce &?

  10. #10
    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
    je voulais dire une variable vide, vu que $myObjet n'a de valeur affectée
    $myObjet est une instance de la class MyClass, elle n'est pas "vide".

    ca change rien?
    rien pour les objets, seulement pour les variables nombres, string et array.

    mais alors quel interet de mettre ce &?
    Compatibilité de syntaxe avec php4, et pour les variables non objet.
    Mais personnellement je n'ai jamais utilisé cette syntaxe désuet.

  11. #11
    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
    Ok bon c'est pas grave merci de m'avoir repondu avec autant d'assiduité!

    une derniere pour la route:

    $myObjet est une instance de la class MyClass, elle n'est pas "vide".
    que contient elle alors?

  12. #12
    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
    que contient elle alors?
    Les membres et les opérations de la classe MyClass, initialisé par son constructeur.

  13. #13
    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
    Merci dewsz pour toutes ces réponses claires.

+ 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