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 :

[Système] Retourner une référence


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [Système] Retourner une référence
    Bonjour !
    Voilà, je viens de lire la doc officielle de php sur les références, selon cette doc, les références ont 3 utilités :

    _ plusieurs variables qui pointent sur la même valeur ( un peu comme un soft link sur un système de fichier )
    _ envoyer des références a des fonctions, qui vont donc pouvoir modifier les variables elle-mêmes et pas juste manipuler des copies


    _ le 3ème point que j'ai pas trop compris : " retourner une référence " :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function &find_var($param) {
      /*  ...code... */
      return $found_var;
    }
    $foo =& find_var ($bar);
    $foo->x = 2;

    http://www.php.net/manual/fr/languag...ces.return.php

    j'ai pas trop compris, si je modifie la valeur de bar, ca va modifier automatiquement la valeur de foo c'est ca ?
    en gros foo pointe sur la meme valeur de find_var($bar), et donc si on modifie $bar ca modifierait foo ??
    ( j'ai testé en local apparemment c'est pas ca )

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    J'ai trouvé , en fait les références sont un usage simplifié des pointeurs, regarde déjà ce petit code :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    function &find_var(&$param) 
    {
    	$param++;
    	return $param;
    }
    
    $testnum = 5;
    echo $testnum.'<br />'; //Affiche 5
    find_var($testnum);
    echo $testnum; //Affiche 6
    ?>

    Donc en fait tout se passe dans la déclaration de la fonction depuis PHP 5.0. Le premier & avant le nom de la fonction indique que tu retourne la référence de la variable et non pas une copie (il ne faut pas mettre de ' & ' dans le return). Le deuxieme & indique que tu envoi la référence du paramètre et non pas sa copie lors de l'appel de la fonction. C'est identique à l'utilisation des pointeurs en C, mais plus simple à utilisé. Y a moyen de gagner beaucoup de temps dans les script PHP en utilisant ce nouveau système, évitant ainsi de multiple copie d'objet ou autre lorsque ce n'est pas nécessaire.
    Aussi tu peut enlever le & car tu modifie directement la zone mémoire de la variable, et donc tu peut aussi zapper le return au passage, sinon tu pourra toujours créer un deuxieme 'pointeur' au retour de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $testnum = 5;
    echo $testnum.'<br />'; //Affiche 5
    $test2 = find_var($testnum);
    echo $testnum.'<br />'; //Affiche 6
    echo $test2; //Affiche 6 aussi
    Cepandant il ne faut pas oublier qu'une modification de $test2 modifiera aussi $testnum car ces deux variables possédent la même zone mémoire.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    bah le code que tu viens de me montrer correspond au point 2ème point que j'avais énoncé, il marche très bien sans le & devant le nom de la fonction ...

    merci quand même

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Je viens d'éditer au dessus :o, en gros la référence permet à PHP de modifier directement la zone mémoire qui est associé au nom de ta variable dans sa table des symboles, sans copier les données pour les utilisées. Tu peut très bien créer 20 variables qui se partagent tous la même zone ( le même objet, ou valeur ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function find_var( &param )
    {
       $param++;
    }
     
    $test = 3;
    find_var($test);
    echo $test; //Affiche 4.
    Bé sinon je voit pas ce que tu veut ? :o Mais c'est vrai que le retour de la référence est utile dans peu de cas.
    Par exemple si tu as une variable 'originale' qui ne doit pas être modifiée tu peut la donner en argument normal et ainsi en retournant la référence de l'objet modifié tu aura en tout et pour tout que 2 variables avec lesquelles travailler. PHP créera une copie au début de la fonction mais te renverra la référence pour qu'ensuite tu modifie directement la valeur qu'il aura ainsi créer dans la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function &testRef( $test )
    {
       $test = $test + 10;
       return $test;
    }
     
    $num = 5; //Cette variable ne doit jamais être modifié (par exemple )
    $num2 = testRef( $num );
    find_var($num2);
    echo $num; //Affiche 5
    echo $num2; //affichera 16
    Tu vois le principe ? ^^

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    non je vois pas trop, je me répète mais ca marche très bien sans le & devant ta fonction testRef

    j'ai compris ce qu'est une référence, ainsi que le 1er exemple ( findvar ), on y manipule directement le paramètre et non une copie, mais je vois trop ce que ca veut dire retourner une référence ( une référence sur quoi ??? )

    tu pourrais "expliciter" la variable qui est référencée ??

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Alors en fait quand tu créer une variable, le nom de cette variable est stockée dans la 'Table des Symboles', c'est PHP qui s'en occupe. En fait dans cette table, il associe un emplacement mémoire avec le nom de ta variable (le numéro d'offset ou se trouve tes données dans la mémoire vive), et donc en fait la référence c'est justement ce numéro d'offset (c'est les pointeurs en C ). Donc c'est vrai que le retour de la référence est à utiliser si c'est vraiment nécessaire, car il te renverra le numéro d'offset et l'associera au nom de variable à gauche de l'affectation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $variable = 5;
    /* PHP va créer un nom VARIABLE, puis à coter il va mettre 0xEF05
    (offset mémoire en hexadécimal, si tu comprend pas trop c pas important
     la), qui lui indiquera ou aller chercher en mémoire si tu demande 
    cette variable, puis à cet emplacement 0xEF05 il va y mettre le 5. */
     
    $test = testRef( $variable );
    /*Alors ici PHP va aller lire le 5 de $variable à l'emplacement 0xEF05, le copier
    ensuite ailleur (car tu ne passe pas la référence de $variable), par exemple à
    l'emplacement 0xAA05, et ensuite comme il doit te retourner la référence, 
    il va te renvoyer justement ce 0xAA05, qui sera affecté au nom TEST dans la
    table des symboles. */
    Tu vois le truc en fait ? :o

    PS :Tain jvais faire un shéma pour expliquer car c'est tout con en fait. Mais dur à expliquer sans shéma.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    je comprend un peu mieux, en gros on utilise pas la fonction pour renvoyer une valeur, ou une chaine de caractère mais pour renvoyer une variable quoi

    si j'ai bien compris, on a une variable $c, on veut la faire pointer sur le même contenu qu'une autre variable, mais on ne sait pas encore laquelle
    la fonction qui retourne une référence va nous "choisir" la bonne variable qui va alors être associée à $c, c'est ca ?

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    Plus ou moins oué

    En fait lorsque tu donne la référence, la fonction va modifier directement les variables sans faire de copie, gain de rapidité pour des gros objets, certaines fois c'est même obligatoire sans quoi tu risque de saturer la ram de la machine, d'ailleur si tu donne les références en entrée, tu n'a même pas besoin de return si tu ne modifie que la variable données, mieux encore, tu peut modifier la variable et en renvoyer une autre ( surtout avec PHP qui auto-gère le multi-typage à l'arrache du style $p='coucou';$p=4; sa en langage C, le compilateur te crache au visage direct xD )

    Alors qu'en renvoyant la référence, la fonction va faire une copie des paramètres reçus, travailler avec, et en dernier elle ne renverra pas une copie mais l'emplacement mémoire ou elle à travailler avec. En fait c'est vrai qu'on vois pas trop l'utilité donc c'est dur à comprendre.
    Mais par exemple si tu aurai une fonction qui reçois un nombre en paramètre et créer un tableau d'autant d'éléments que ce nombre donné, si sa monte à plus de 10 000 éléments, ce sera très pratique de renvoyer la référence car sinon PHP devra recopier un tableau de 10 000 éléments avant de te le renvoyer, et la si tu manque de mémoire, bye bye le script . Donc c'est vrai qu'en PHP il faut bien justifier un renvoi de référence pour que ce soit utile, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    function &maxiTableau( $elements )
    {
       //petite sécurité rapide pour remontrer l'opérateur ternaire :D jlaime bien.
       ( ($elements<0) ? ($elements *= -1) : ($elements=$elements) )
       for ( $i=0; $i<$elements; $i++ )
       {
          $tableau[$i] = $i;
       }
       return $tableau;
    }
     
    $maxTable = maxiTableau( 50 000 );
    ?>
    Essaye avec 50 ou 100 000 éléments et après sans renvoyer la référence xD.
    La fonction sert totalement à rien mais on peut voir un peu l'utilité d'un renvoi de référence. Mais en réfléchissant bien avec cette fonctionnalité on pourrai diviser par 2 voir plus le temps d'éxecution des scripts, mais faut être rigoureux car une erreur arrive très vite avec ceci , et encore ca va c'est pas des pointeurs C (ils sont beaucoups plus puissants mais la moindre erreur peut te planter l'ordinateur).

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/05/2012, 15h04
  2. Retourner une référence locale
    Par otocyon dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2009, 17h46
  3. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  4. Réponses: 7
    Dernier message: 19/03/2007, 19h24
  5. Réponses: 6
    Dernier message: 28/09/2005, 11h30

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