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] Modifier attributs d'un objet par référence


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [POO] Modifier attributs d'un objet par référence
    Bonjour,

    je cherche le moyen de modifier un attribut d'un objet via une fonction dans la lequelle cet objet est passé par référence.

    quelques ligne de code vallent mieux qu'un long discours :


    voilà pour faire tres simple ma première classe
    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
    16
    17
    18
    19
    20
     
    class order {
     
    private productList = array();
     
    public function __construct( .....
     
    ...
     
     
    public function setProductList($list=array()) {
      $this->productList = $list;
    }
     
    public function unsetProductList() {
      $this->productList = array();
    }
     
     
    }
    ma deuxième classe
    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 orderBehavior {
     
     public static function modifyOrder(&$o) {
     
       // un autre tableau ( ici juste pour l'exemple )
      $new_product = array( array('id'=>10, 'name' => 'newnom1'),
                                      array('id'=>20, 'name' => 'newnom2')
                             );        
       $o->unsetProductList();
       $o->setProductList($new_product);
     }
     
    }
    mon code
    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
     
    //j'instancie un objet de la classe order
     
    $product = array( array('id'=>1, 'name' => 'nom1'),
                             array('id'=>2, 'name' => 'nom2'),
                             array('id'=>3, 'name' => 'nom3')
                           );       
     
    $o = new order();
     
    // je passe mon tableau
    $o->setProductList($product) ;
     
    // j'appel mon autre function 
    orderBehavior::modifyOrder($o);
    et donc en sorti il devrait avoir changer l'attribut productList de $product à $new_product mais non !

    voilà le resultat :
    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
    16
    17
    18
    19
    20
    21
    22
     
    [productList] => Array
            (
                [0] => Array
                    (
                        [id] => 10
                        [name] => newnom1
                      )
     
                [1] => Array
                    (
                        [id] => 20
                        [name] => newnom2
                      )
     
                [2] => Array
                    (
                        [id] => 3
                        [name] => nom3
                      )
     
    	   )
    il ne me change que les 2 premières ligne du tableau la 3ième restant d'origine ..

    Si mon tableau $new_product comporte le mm nombre de ligne que le premier pas de soucis donc , mais il il en comporte moins il ne change que les clés correspondante .

    En bref la fonction unsetProductList() est totalement sans effet !

    Si quelqu'un peu m'aider à comprendre ca , je lui en serait tres reconnaissant.

    Merci d'avance .

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    En php5, les objets sont passés par référence par défaut, donc tu n'as pas besoins du '&'

    Dans orderBehavior::modifyOrder(), tu as mis $o->setProducts()
    Or, tu ne nous montres que order::setProductList()
    Ce ne sont pas les même méthodes

    Est ce que ça vient de là le problème ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    non il sagit là d'une bête faute de frappe ..

    j'ai édité le premier post pour la corriger .

    Pour le "&" je sais mais c'est mes vieux reste de PHP4 qui résistent encore parfois

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    orderBehavior::modifyOrder($o);
    Tu passes une référence à $o, comportement par défaut de php5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static function modifyOrder(&$o)
    Tu utilises une référence de la variable passée.

    Je ne suis pas sûr, mais la fonction modifyOrder n'agit-elle pas alors sur une référence à la référence de $o ? Tordu...

    Bref, vu que tout est passé par référence par défaut, n'utilises pas les & sauf cas vraiment spécifique...

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Et bien malheureusement avec ou sans le & le résultat est le même.

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Avant d'utiliser la classe statique, il est peut-être bon de vérifier que le unsetProduct marche en l'appelant directement dans le code principal pour voir...

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Oui la méthode fonctionne correctement dans le script.

    Par contre j'ai testé le même script sur 2 serveurs différent pour voir et surprise.

    Sur un serveur en 5.2.0 cela fonctionne parfaitement , sur celui en 5.1.6 et bein cela ne fonctionne pas !

    Quelle directive pourrais bien engendrer ça ?
    Ou alors est ce seulement du à la différence de version ?

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ca foire dans le script ou en appel static ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Sur le serveur en version 5.1.6 ca foire en appel static alors que ca fonctionne sur le 5.2.0 .

    Vraiment étrange cette histoire.

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/05/2009, 16h24
  2. Réponses: 4
    Dernier message: 01/08/2008, 17h13
  3. [POO] Passage d'objet par référence
    Par PinGu- dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2008, 10h23
  4. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 17h54
  5. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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