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 :

Assignation d'objet


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 Assignation d'objet
    Salut !

    je ne comprend pas cet exemple dans la doc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $assigned   =  $instance;
    $reference  =& $instance;
     
    $instance->var = '$assigned aura cette valeur';
     
    $instance = null; // $instance et $reference deviennent null
     
    var_dump($instance);
    var_dump($reference);
    var_dump($assigned);
    ?>
    affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    NULL
    NULL
    object(SimpleClass)#1 (1) {
       ["var"]=>
         string(30) "$assigned aura cette valeur"
    }
    a ce que j'ai cru comprendre $assigned pointe vers le meme objet que $instance, donc je vois pas la difference entre :

    $assigned = $instance;
    et
    $reference =& $instance;

    et ne comprend pas plus pourquoi :
    $instance->var = 'xx';
    va modifier $assigned mais pas :
    $instance = null;

    ce que je pourrais supposer c'est que "$instance->var =" modifie l'objet pointé quand $instance = modifie le pointeur (et donc pas l'objet) mais alors pourquoi a ce moment là $reference ne reagit pas de la meme maniere ? :/

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 700
    Par défaut
    tu n'es pas le seul à trouver ça bizarre, un peu plus bas il une explication (en anglais) de quelqu'un qui à l'air d'avoir compris comment ça fonctionne :
    http://php.net/language.oop5.basic#79856

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    hum... c'est pas simple à expliquer. C'est une histoire d'instance et de référence...
    En fait, quand tu fais $instance->var =, tu modifie un attribut de l'objet, donc le changement sera visible quelque soit la référence à l'objet que tu utilises. Alors que quand tu fais $instance = , tu modifie la référence à l'objet et non l'instance de l'objet...

    C'est un peu comme si tu avais une boite avec plusieurs ouvertures. Si tu mets quelque chose dans la boite par une des ouvertures, tu pourras le récupérer par n'importe laquelle. Mais si tu fermes une ouverture, ça ne vide pas la boite pour autant et son contenu reste accessible par les autres ouvertures.

    C'est plus clair comme ça ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    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 pour vos reponses,

    decidement je vais me faire une check list :

    - 1 reflechir (sisi faut y penser)
    - 2 la doc
    - 3 les COMMENTAIRES de la doc
    - 4 google
    - 5 le forum developpez
    - 6 poser la question

    @ celira , ton histoire de boite c'est pour simplifier t'es sure?
    je plaisante je comprend ce que tu veux dire mais c'est a peu pres ce que je decrivais quand je disais (pour l'histoire de la boite) :

    "$instance->var =" modifie l'objet pointé quand $instance = modifie le pointeur (et donc pas l'objet)
    Pour un peu eclaircir tes propos (sur les ref et instance), je résume :

    Pour une variable normale on a le shema :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // $Var       --->+---Slot1---+
    //                |(contenu1) |        
    // $reference --->+-----------+    
    //                                            
    //                +---Slot2---+    
    // $assignment -->|(contenu1) |
    //                +-----------+

    $Var et $reference pointent vers le meme slot, $assignement a une copie du contenu dans son propre slot, donc si on modiie $var on modifie egalement $reference et reciproquement, mais $assignement est independant on peut donc le modifier a loisir sans changer les autres.

    ca c'est ton histoire de boite maintenant avec les objets on a un probleme, les slots ne peuvent acceuillir que des types de données de base ( entier, chaines, bool etc.) et pas un objet, donc php crée une poignée dans le slot qui va pointer vers l'objet.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // $objectVar --->+---Slot1---+
    //                |(poignée1) |----+        
    // $oReference--->+-----------+    |    
    //                                 |
    //                +---Slot2---+    |    
    // $oAssignment-->|(poignée1) |----+
    //                +-----------+    |
    //                                 |
    //                                 v
    //                        Object(1):foo="bar"
    (didont quel galere pour faire ces joulies shemas )

    Donc ici les 3 variables vont changer le MEME OBJET,
    $objectVar->foo = "café";
    ou
    $oReference->foo = "café";
    ou
    $oAssignment->foo = "café";

    conduiront a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // $objectVar --->+---Slot1---+
    //                |(poignée1) |----+        
    // $oReference--->+-----------+    |    
    //                                 |
    //                +---Slot2---+    |    
    // $oAssignment-->|(poignée1) |----+
    //                +-----------+    |
    //                                 |
    //                                 v
    //                        Object(1):foo="café"
    cependant si on fait
    $objectVar = NULL ;
    alors ce sera le slot1 (la poignée) qui sera affectée et non l'objet et ca donnera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // $objectVar --->+---Slot1---+
    //                |(  NULL  ) |----+        
    // $oReference--->+-----------+    |    
    //                                 |
    //                +---Slot2---+    |    
    // $oAssignment-->|(poignée1) |----+
    //                +-----------+    |
    //                                 |
    //                                 v
    //                        Object(1):foo="café"
    Et puis ben ca quand on le sait pas ben c'est pas simple a deviner !

    Voila pour les gens qui aurait le meme probleme ou pour d'autre qui devrait l'expliquer!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2013, 21h20
  2. Possibilité d'assigner l'objet courant?
    Par Theviking dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/10/2011, 14h20
  3. Assigner un objet à un tableau
    Par lordashram dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2009, 16h57
  4. Objets dynamiques et assignation de méthodes
    Par Nuwanda dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 10/06/2008, 11h25
  5. [POO] Assignation d'objet en php5
    Par jeff_! dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2006, 17h22

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