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] Construction de classes comprenant d'autres classes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut [POO] Construction de classes comprenant d'autres classes
    Bonjour à tous,
    Je rencontre actuellement un problème conceptuel au moment de faire mes objets PHP.
    Je vais prendre un exemple simple, imaginons qu'une boutique peut avoir de 0 à N produits et que 1 produit peut appartenir de 0 à N boutique. Comment représenter ç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
    22
    23
    24
    25
    26
     
    class Boutique{
        private $id;
        private $nom;
     
        function __construct($nom, $id=null) {
            $this->id = $id;
            $this->nom = $nom;
        }
     
        public function getId() {
            return $this->id;
        }
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getNom() {
            return $this->nom;
        }
     
        public function setNom($nom) {
            $this->nom = $nom;
        }
    }
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class Produit{
        private $id;
        private $nom;
        private $prix;
     
        function __construct($nom, $prix, $id=null) {
            $this->id = $id;
            $this->nom = $nom;
            $this->prix = $prix;
        }
     
        public function getId() {
            return $this->id;
        }
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getNom() {
            return $this->nom;
        }
     
        public function setNom($nom) {
            $this->nom = $nom;
        }
     
        public function getPrix() {
            return $this->prix;
        }
     
        public function setPrix($prix) {
            $this->prix = $prix;
        }
    }
    1) Faut il mettre une liste de produits dans la classe boutique?
    2) Faut il mettre une liste de boutique dans la classe produit?
    3) Faut il créer une classe permettant de lier les 2?

    Bref, je suis un peu perdu, si je met une liste, alors au moment où je requête, j'ai un risque de récupérer toute ma base de données en 1 seule requête.

    Comment traitez vous ce genre de cas?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par défaut
    Bonsoir,

    Moi je ferai une table SQL avec le schéma suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boutiqueProd(id_produit, id_boutique)
    Comme ca, si je veux connaitre toutes les boutiques vendant le produit 1, je n'ai qu'a faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_boutique FROM boutiqueProd WHERE id_produit=1
    Et pour savoir ce qu'il y a dans la boutique 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_produit FROM boutiqueProd WHERE id_boutique=1
    Evidemment, il faut ajouter les JOIN nécessaires...
    Maintenant, ce n'est qu'une idée...

    Bonne soirée

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 121
    Par défaut
    @zuurstof, il ne parlait clairement pas d'une conception de base de données.
    La conception à la base est la même mais tu pars vite dans le technique alors là c'est un peu hors sujet.
    Mais pour une bdd, ce que tu as dit est correct, il faut une table relationnelle entre les 2 autres.

    Pour revenir au sujet, il faut savoir qu'à la base quand tu créés une classe d'un objet (ici un produit), cela doit compter pour UN article (d'un produit).
    Car la vraie POO, tu créés une classe pour un Objet puis si besoin tu créés une classe comme collection de cet objet !

    Bref, ici Tu as une classe boutique qui représente une boutique et une classe produit qui représente un produit...il te manque plus que la classe Article, non ?
    Un article a UNE boutique et UN seul produit comme références.

    NB: Tu as mis des $id par défaut null, ça sous entend que tu peux les créer en Objet avant leur création dans la bdd mais tu n'as fait aucune méthode d'insertion dans la bdd et puis tu as fait une méthode SetId(), OMG ! Tu te rends pas compte de l'énorme erreur que c'est ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut
    Je n'ai pas de méthode pour insérer en base, car ce n'est pas à mon objet de s'insérer en base, j'aurais plutôt une classe statique (GestionProduit) qui le fera.

    Ce que je ne comprends pas c'est comment référencer une classe dans une autre. Est je intérêt à mettre une liste de chaque côtés ou non?
    Si j'étais sur un blog avec 1 article possède de 0.*commentaires, aurais je eu une liste de commentaire dans l'objet article ou non?

  5. #5
    Membre averti
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    Ce que je ne comprends pas c'est comment référencer une classe dans une autre.
    C'est une relation d'agrégation.

    Code php : 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
    class Boutique
    {
     
    	private $_produits = array();
     
    	public function ajouterProduit(Produit  $produit)
    	{
    		$key = $produit->_getNom().$produit->_getID();
    		$this->_produits[$key] = $produit;
    	}
    }
     
     
    class Produit
    {
    	// ....
     
    }


    Pour,le problème,qu'un produit peut appartenir un plusieurs boutiques,il faut comme expliquer par IGstaff,une généralisation pour les produits (classe qui relie entre boutique => produit) comme par exemple : étage du produit(attribut : nombres ...) ,ou bien pavillon ... et qui appartient,justement,à une seule boutique.

  6. #6
    Membre confirmé Avatar de bigltnt
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function ajouterProduit(Produit &$produit)
    Je crois que le "&" du passage par référence n'est pas utile en PHP; lorsque l'on travaille en objet, on transmet naturellement la référence il me semble ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/05/2008, 10h02
  2. Réponses: 3
    Dernier message: 29/04/2008, 14h14
  3. Réponses: 5
    Dernier message: 23/04/2007, 16h31
  4. Instancier une classe comprenant une autre classe
    Par jymmy dans le forum Général VBA
    Réponses: 2
    Dernier message: 17/11/2006, 12h33
  5. Réponses: 4
    Dernier message: 25/07/2006, 16h30

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