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] Tableau d'objets B dans une instance de class A


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [POO] Tableau d'objets B dans une instance de class A
    Bonjour,

    Je me retrouve face à un problème de conception simple (j'en suis sûr) dont la solution me paraît bidouillée :

    J'ai deux classes, A et B.

    Je souhaiterais stocker des instances de B dans un attribut (tableau) de la classe A.

    Chaque instance de B doit être stockée dans l'attribut A puis retournée à la variable appellante. J'utilise un compteur interne pour défiinir les clés des tableaux :

    Class A
    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
     
     
    class A
    {
      private $objets_B = array();
      private $i = 0;
     
      public function __construct()
      {
       // ...
      }
     
      public function setObjetB()
      {
         $this->i++;
     
         $this->objets_B[$this->i] = new B;
     
         return $this->objets_B[$this->i];
      }
    }
    Script appellant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    $objet_1 = new A;
     
    // Cette méthode crée une instance de B.
    $objet_2 = $objet_1->setObjetB()
    Ce qui me pose problème c'est de devoir utiliser une variable compteur ($this->i) pour que l'objet puisse être retourné correctement. Si j'avais utilisé $this->objets_B[] = new B; return $this->objet_B[]; ça n'aurait pas fonctionné (Le compteur interne ne faisant pas office).

    Quelq'un peut-il m'éclairer ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    Pourquoi ne pas utiliser les classes créé à cet effet dans la SPL ?

    http://www.php.net/~helly/php/ext/spl/

    Cf ArrayObject
    http://www.php.net/~helly/php/ext/sp...rayObject.html

    Sinon je n'ai pas trop compris ton code ce qui ne m'aide pas pour t'aiguiller

    bbye

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut,

    l'avantage avec le compteur interne, et l'utilisation de [] c'est que quand c'est la seule utilisation pour l'insertion dans le tableau (c'est à dire qu'il n'y a pas d'autres indices dans le tableau que ceux générés par []) il suffit de faire cout($tablo) - 1 pour avoir le dernier indice :
    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
    class A
    {
      private $objets_B = array();
     
      public function __construct()
      {
       // ...
      }
     
      public function setObjetB()
      {
         $this->objets_B[] = new B;
     
         return $this->objets_B[count($this->objets_B) - 1];
      }
    }

  4. #4
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    Salut,
    pourquoi ne pas construire ton objet B dans la méthode appelante, et le passer en argument à ta méthode de l'objet A ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $objetB = new B();
    $objetA->addObjetB($objetB);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A {
      $_objetB = array();
      function addObjetB($objetB) {
        $this->$_objetB[] = $objetB;
      }
    }
    En plus, c'est beaucoup mieux que ton ancienne méthode set qui fait 3 choses en même temps : construction, affectation, et retour.

    a+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Citation Envoyé par nako
    pourquoi ne pas construire ton objet B dans la méthode appelante, et le passer en argument à ta méthode de l'objet A ?

    Code :
    $objetB = new B();
    $objetA->addObjetB($objetB);


    Code :
    class A {
    $_objetB = array();
    function addObjetB($objetB) {
    $this->$_objetB[] = $objetB;
    }
    }

    a+
    C'est une solution à laquelle je n'ai pas pensé. Cela me paraissait naturelle que la classe A soit instanciée la première. (Ce qui n'a aucun sens en faite si ce n'est que j'ai raisonné la chose à l'envers Merci pour cette soluce !

    [quote]

    Citation Envoyé par Swoög
    l'avantage avec le compteur interne, et l'utilisation de [] c'est que quand c'est la seule utilisation pour l'insertion dans le tableau (c'est à dire qu'il n'y a pas d'autres indices dans le tableau que ceux générés par []) il suffit de faire cout($tablo) - 1 pour avoir le dernier indice :
    Code :
    class A
    {
    private $objets_B = array();

    public function __construct()
    {
    // ...
    }

    public function setObjetB()
    {
    $this->objets_B[] = new B;

    return $this->objets_B[count($this->objets_B) - 1];
    }
    }
    Merci pour ces explications et cette astuce, au moins c'est clair cette fois-ci. Evidemment que le compteur interne est incrémenté après l'assignation (raisonnement hasardeux de ma part == aucun raisonnement).

    Citation Envoyé par ePoX
    Pourquoi ne pas utiliser les classes créé à cet effet dans la SPL ?
    Effectivement, d'ailleurs apart Exception je savais pas qu'il y'avait autant de classes utiles dans la librairie PHP...


    Merci à tous pour vos réponses,
    Faut vraiment que j'me réveille moi !!

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

Discussions similaires

  1. une variable tableau public dans une instance de classe
    Par tamtam64 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/06/2015, 07h52
  2. [POO] Sérialiser un objet PDO dans une classe
    Par __fabrice dans le forum Langage
    Réponses: 9
    Dernier message: 15/09/2008, 22h30
  3. Réponses: 4
    Dernier message: 20/07/2006, 10h35
  4. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  5. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37

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