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] Manipuler un objet contenu dans l'attribut tableau d'un autre objet


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 14
    Points : 15
    Points
    15
    Par défaut [POO] Manipuler un objet contenu dans l'attribut tableau d'un autre objet
    Bonjour à tous,

    J'ai un petit problème avec un attribut de type tableau qui contient des objets.

    Je vous explique mon problème :

    J'ai un objet A dont un de ses attributs est un tableau T contenant des objets B.
    Mes objets B ont des getters et des setters.

    En faisant une boucle sur mon tableau, j'arrive sans problème à récupérer les valeurs des attributs de mes objets B.
    Mais je n'arrive pas à modifier leurs valeurs.

    Voici un 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
    16
    17
    18
     
    $a = new A();
     
    //La méthode "ajoute()" ajoute un objet dans l'attribut tableau de la classe A
    $a->ajoute(new B("nom1","valeur1"));
    $a->ajoute(new B("nom2","valeur2"));
     
    //Le tableau est maintenant de la forme :
    //Array([nom1] => objet, [nom2] => objet)
     
    //Je parcours mon tableau
    foreach($a->getTableau() as $element){
        $element->SetValeur("nouvelle_valeur");
     
        echo $element->GetValeur(); //Affiche bien "nouvelle_valeur"
    }
     
    echo $element->tableau["nom1"]->getValeur(); //Affiche "valeur1" et non pas "nouvelle_valeur"
    Je ne comprends pas pourquoi je ne peux pas modifier la valeur des attributs de mon objet B.
    Quelqu'un peut m'aider ?
    Merci.

    Sly

    PS : J'utilise PHP4.

  2. #2
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Salut,

    je suis pas un pro des objets mais d'un point de vue syntaxique :
    $element existe encore en dehors de la boucle foreach ?

    Tu ne devrais pas plutot ajouter une méthode à A qui te retourne un element B particulier ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function GetElement($Nom)
    {
    // retourne un objet de type B
    return Tableau[$Nom];
    }
    et l'utiliser avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo $a->GetElement['Nom1']->getValeur();
    // ou
    $ElemB = $a->GetElement['Nom1'];
    echo $ElemB -> getValeur();

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Non, en php il n'y a pas de portée de bloc, seulement une portée de fonction. Les variables manipulées par foreach existent avant et après la boucle (ce qui est la source d'erreur courante)

    http://www.php.net/manual/fr/control...es.foreach.php

    Note : Bien que le tableau soit référencé, foreach travaille sur une copie du tableau spécifié, et pas sur le tableau lui-même.
    Vous avez deux manières de corriger le problème :

    En utilisant une référence sur l'élément (uniquement PHP5) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tableau = $a->getTableau()
     
    foreach($tableau as &$element)
    {
        $element->SetValeur("nouvelle_valeur");
    }
    en utilisant un index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tableau = $a->getTableau()
     
    foreach($tableau as $index => $element)
    {
        $tableau[$index]->SetValeur("nouvelle_valeur");
    }

  4. #4
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Citation Envoyé par Blustuff
    Non, en php il n'y a pas de portée de bloc, seulement une portée de fonction. Les variables manipulées par foreach existent avant et après la boucle (ce qui est la source d'erreur courante)
    En fait, je voulais dire que, si $element est toujours accessible, elle ne peut contenir que le dernier objet dur foreach.

    Je crois d'ailleurs que c'est une erreur de frappe et qu'il voulait parler de $a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $a->tableau["nom1"]->getValeur();

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup. La solution suivante marche parfaitement (en PHP4) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tableau = $a->getTableau()
     
    foreach($tableau as $index => $element)
    {
        $tableau[$index]->SetValeur("nouvelle_valeur");
    }
    Je ne sais pas comment j'ai fait pour passer à coté de ça :
    Note : Bien que le tableau soit référencé, foreach travaille sur une copie du tableau spécifié, et pas sur le tableau lui-même.
    Merci Blustuff

    Citation Envoyé par Ricou13
    Je crois d'ailleurs que c'est une erreur de frappe et qu'il voulait parler de $a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $a->tableau["nom1"]->getValeur();
    C'était effectivement une erreur de frappe

    Merci pour votre aide !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/11/2007, 15h51
  2. [POO] Retourner une variables contenu dans une autre méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 6
    Dernier message: 15/10/2007, 16h29
  3. Réponses: 15
    Dernier message: 04/10/2007, 10h37
  4. Manipulation des valeurs contenues dans un tableau
    Par khasanouray dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2007, 20h36
  5. [jTree]Recupérer l'objet contenu dans la feuille
    Par nesbla dans le forum Composants
    Réponses: 1
    Dernier message: 27/11/2006, 15h03

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