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 :

POO: Passage par référence, question technique.


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut POO: Passage par référence, question technique.
    Bonjour à tous !

    Je programmais un truc, lorsque je me suis posé une question au sujet des passages par référence.

    Pour résumer ma question, voici un bout de code ultra-simplifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Objet
    {
       private $var3;
     
       public function __construct(&$var2){
          $this->var3 = var2;
       }
     
       public function getVar(){ return $this->var3; }
    }
     
    $var1 = array('bidon', 'nawak');
    $objet = new Objet($var1);
    Question #1:
    Est-ce qu'à la fin de mon code, je stock 1 (var1) ou 2 (var1 & var3) tableau en mémoire, vu qu'il y a eu le passage par référence ?



    Partie 2:

    Si je rajoute, à la toute fin, ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unset($var1);
    var_dump($objet->getVar());
    Question #2:
    Est-ce que je vais voir mon tableau avec bidon et nawak ?


    Question #3:
    Si la réponse à la question 2 était oui; Comment peut-ont faire pour réellement stocker une référence dans un objet instancié ?


    Question #4:
    À confirmer: si je faisait pas un passage par référence, var2 serait détruite à la fin de l'exécution du constructeur. Donc il y aurais uniquement eu trois tableaux en mémoire au moment de faire l'affectation du contenu de var3.


    Merci bien !

  2. #2
    Rédacteur

    Avatar de Yoteco
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 099
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut,

    Citation Envoyé par FMaz Voir le message
    Question #1:
    Est-ce qu'à la fin de mon code, je stock 1 (var1) ou 2 (var1 & var3) tableau en mémoire, vu qu'il y a eu le passage par référence ?
    Tu stockeras 2 tableaux en mémoire, car tu passe var1 par référence mais tu n'assigne pas une valeur à var3 par référence.

    Citation Envoyé par FMaz Voir le message
    Question #2:
    Est-ce que je vais voir mon tableau avec bidon et nawak ?
    Oui. (cf. question 1)


    Citation Envoyé par FMaz Voir le message
    Question #3:
    Si la réponse à la question 2 était oui; Comment peut-ont faire pour réellement stocker une référence dans un objet instancié ?
    Citation Envoyé par FMaz Voir le message
    Question #4:
    À confirmer: si je faisait pas un passage par référence, var2 serait détruite à la fin de l'exécution du constructeur. Donc il y aurais uniquement eu trois tableaux en mémoire au moment de faire l'affectation du contenu de var3.
    Je dirais oui mais suis pas sûr !
    Blog - Mon espace developpez -
    Oracle Certified Professional, Java SE 6 Programmer
    eZ Publish Certified developer

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    L'operateur pour passer par reference cest =& il me semble.

  4. #4
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Ha voilà !
    Je savais bien que quelque chose clochais dans ce que j'écrivais !

    =& ( Source: http://ca2.php.net/manual/fr/languag...assignment.php )
    Et maintenant tout est bien structuré dans ma caboche

    Merci à vous deux !

    Dernier truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function test1(&var2)
    { 
       ...
    }
     
    $var1 = array( .... );
    test1 ($var1);
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function test1(var2)
    { 
       ...
    }
     
    $var1 = array( .... );
    test1 (&$var1);
    La différence est que l'opérateur & est placé au moment de l'appel le fonction plutôt que dans les paramètres.

    Est-ce que c'est du pareil au même dans les 2 cas ?

  5. #5
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonsoir,

    Il est préférable et plus performant d'utiliser la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function test1(&$var2)
    { 
       ...
    }
     
    $var1 = array( .... );
    test1 ($var1);
    Lorsque tu utilises l'autre méthode, tu forces un passage par référence sur une fonction qui à l'origine attend une données de type valeur.

  6. #6
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Et concrètement, qu'est-ce que ca change de forcer le passage par référence ?

    ( à noter: j'utilise pas cette façon de faire, je veux juste être bien certain de comprendre )

  7. #7
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Comme dit dans mon message précédent, c'est moins performant.

    Voici ce que la documentation officiel explique :
    allow_call_time_pass_reference
    Active ou non la possibilité de forcer les arguments à être passés par référence lors de l'appel à une fonction. Cette méthode est dépréciée et ne sera très certainement plus supportée dans les futures versions de PHP/Zend. Il est préférable de spécifier directement dans la déclaration de la fonction si les arguments seront passés ou non par référence. Nous vous encourageons à désactiver cette option et de vous assurer que vos scripts fonctionnent correctement avec, afin d'être sûr qu'ils fonctionneront avec les versions futures du langage (vous devriez recevoir une alerte à chaque fois que vous utiliserez cette fonctionnalité).

    Passer les arguments par référence à l'appel de la fonction a été abandonné pour rendre le code plus clair. Les fonctions risquaient de modifier les arguments d'une manière aléatoire si l'argument était passé par référence. Pour éviter cet effet, il est préférable de spécifier le passage par référence dans le prototype de la fonction.
    Penses à passer le topic en Résolu si tu es OK

  8. #8
    Membre confirmé
    Avatar de FMaz
    Inscrit en
    Mars 2005
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 643
    Points : 640
    Points
    640
    Par défaut
    Bon, si c'est deprecated, autant ne pas se poser la question En fait, je cherchais juste à savoir, mécaniquement, derrière, dans la mémoire, quelle était la différence.

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

Discussions similaires

  1. Question sur le passage par référence
    Par Baubeau Cédric dans le forum Débuter
    Réponses: 2
    Dernier message: 28/01/2010, 11h14
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 21/08/2006, 00h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 18h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 12h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 11h02

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