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] POO > classe + connexion BDD


Sujet :

Langage PHP

  1. #1
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut [POO] POO > classe + connexion BDD
    Hello!

    Grande réflexion que je me pose régulièrement, et dont je n'arrive toujours pas à trouver de solution parfaite... Peut etre vais-je y arriver en mélangeant plusieurs cerveaux?

    Comment faites-vous pour utiliser dans vos classes des objets d'autres classe sans aucunes relations l'une avec l'autre?

    L'exemple le plus frapant est la connection à la base de donnée. J'ai une classe qui me permets de faire tout mes traitements de bases de donnée. Elle s'occupe d'ouvrir les connexions quand c'est nécessaire, effectue les requetes, traite mes éléments, compte le nombre de données que j'ai, gère la pagination si besoin, etc...

    De ce manière, je peux récupérer et traiter mes datas tel un objet, en sachant que tout est traiter à un seul endroit. Jusque la, c'est le pied, c'est vachement pratique...

    Maintenant, comment vous faites pour accéder à cet objet BDD dans une autre classe, sans avoir de parentalisation (oula, ca se dit? :p), sans utiliser de global, et je ne parle pas de le passer en paramètre à chaque fois...

    Un exemple concret est une classe menu. Classe assez basqiue, mais très chiante à la fois, car on en a toujours besoin. J'ai mon objet menu, qui contient différents détails, dont la structure, les différents niveaux, les parents, enfants, etc, etc... Mais ces informations, je dois aller les chercher dans ma base de donnée. Comment j'accède à mon objet BDD sans:
    - utiliser le global $objet_bdd (<- AU SECOURS... je hais au possible les variables globales...)
    - passer mon objet à mon objet (beurk...)

    Je dois mettre en include ma classe BDD dans chacune de mes classe, et déclarer un objet BDD dans mon constructeur, et le garder en temps que propriété de mon objet menu? A priori, ce serait la solution la plus "propre".

    Et vous, comment faites-vous ???

    /discuss

    Onet
    ---
    Retrouvez tout mes tutos et mes articles: http://www.olivierlange.com

  2. #2
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    include 'dbclass.php';
     
    class Maclass
    {
         public function methode1()
         {
              $db = new dbclass();
              return $db->query('SELECT * FROM table');
          }
    }
     
    $class =  new Maclass();
    var_dump($class->methode1());
    et si tu veux l'utilise partout dans ta 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
    21
    22
    23
    24
    25
    26
    27
    28
     
    include 'dbclass.php';
     
    class Maclass
    {
         private $db;
     
         public function __construct()
         {
              $this->db = new dbclass();
          }
         public function methode1()
         {
              return $this->db->query('SELECT * FROM table');
          }
         public function methode2($champ1,$champ2)
         {
              return $this->db->query('INSERT INTO table(champ1,champ2) VALUES ('.$champ1.','.$champ2.')');
          }
         public function __destruct()
        {
              $this->db->close();
         }
    }
     
    $class =  new Maclass();
    var_dump($class->methode1());
    var_dump($class->methode2());
    La composition est toujours preferable a l'heritage car le couplage est faible. et c'est a mon sens est plus naturelle que l'heritage qui est trop souvent utiliser a tord (combien de fois j'ai vu une classe genre page heriter d'un classe bdd )

  3. #3
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    La composition est toujours preferable a l'heritage car le couplage est faible. et c'est a mon sens est plus naturelle que l'heritage qui est trop souvent utiliser a tord (combien de fois j'ai vu une classe genre page heriter d'un classe bdd )
    Clairement! C'est quelque chose qui m'horripile au moins autant qu'un
    A chaque fois que la fonction truc à besoin d'accéder à la base de donnée...

    Donc c'est bien ce que je pensais, l'inclusion de la classe BDD dans les classes ou on en a besoin, et la création de l'objet db dans le construct est la méthode la plus propre pour gérer ce cas de figure. Merci

    Des avis contraire?
    /discuss

    Onet
    ---
    Retrouvez tout mes tutos et mes articles: http://www.olivierlange.com

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Pour le cas précis de la BDD , je préfère passer mon objet sql à mes classes.
    Pourquoi créer 5 objets sql et donc ouvrir 5 connexions (si pas de connexions persistantes) alors que l'objet approprié existe déjà ?

    Je vois pas en quoi il est plus propre de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    include 'dbclass.php';
     
    class Maclass
    {
         private $db;
     
         public function __construct()
         {
              $this->db = new dbclass();
          }
    }
    Que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Maclass
    {
         private $db;
     
         public function __construct($objdb)
         {
              $this->db = $objdb;
          }
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    mon_nom_est_personne
    Invité(e)
    Par défaut
    tout depend de ton design et du cas de figure.
    dans l'hypothese d'une classe unique comme cite precedement c'est plus simple.
    Dans le cas d'un classe composee qui a besoin de la base de donne (si ca arrive pour c'est que t'as un probleme dans ton design) oui la passer en argument et preferage mais en temps que reference.
    Car si tu la passe comme tu l'as fait tu duplique la variable en memoire est c'est pas terrible. en passant un reference tu travail reellement avec le meme objet. ca serait p-e une idee a soumettre la gestion des pointer comme en c++.

  6. #6
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    Devoir passer ton objet db en paramètres à toutes tes classes, je ne suis pas convaincu. Non seulement c'est super lourd (pas quand tu as 4 classes qui se courent après et quelques objets, mais dans le cas d'un projet important, ou tu travaille avec un nombre bien plus important, c'est, je pense, non seulement un risque d'erreur, mais compliquer).

    Après, je pense que d'ouvrir 5 connexions, c'est de la merde en boite, également.

    Quid d'une classe Singleton de base de donnée? De cette manière, on est sur de ne pas avoir 15 objets et accès BdD en //, sans avoir besoin de passer a chaque fois l'objet en paramètre.

    Je crois que Zend l'utilise dans son framework?

    Onet
    ---
    Retrouvez tout mes tutos et mes articles: http://www.olivierlange.com

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Dans le cas d'un classe composee qui a besoin de la base de donne (si ca arrive pour c'est que t'as un probleme dans ton design) oui la passer en argument et preferage mais en temps que reference.
    Pourrait tu expliquer pourquoi celà relève d'un problème de conception ?

    Dnas ton exemple précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Maclass
    {
         private $db;
     
         public function __construct()
         {
              $this->db = new dbclass();
          }
    }
    Tu as bien une composition entre MAclass et dbclass non ? Peut être faut il que je me replonge dans mes cours d'uml ^_^
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    mon_nom_est_personne
    Invité(e)
    Par défaut
    en fait je parler du cas suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Maclass
    {
         private $db;
     
         public function __construct()
         {
              $this->db = new dbclass();
              return new Maclass2($this->db);
              // ou pire
             return new Maclass2(new dbclass()); 
          }
    }
    a mon sens quand tu fais des trucs comme ca y'a un souci ca la double composition de dbclass rend son couplage fort, si elle foire tout foire.
    pour l'access a la base de donnee je concidere (mais je peu me tromper) qui faut que l'acces a la bdd se fasse sur un top-node (je concidere mon programme comme un graphe oriente ou ontologie) car la composition est pas une relation is-a comme l'heritage ou la tout prend son sens. Mais la composition est une relation is-part-of. J'en veux pour preuve qu'on stock la class dans une variable (membre ou non) de la classe ou s'opere la composition.
    Cette relation is-part-of, signifie pas que la classe composee et une partie de la classe superieur (une propriete en un sens) donc elle ne doit pas herite de point commun comme une connection a la base de donnee. Et passe un objet, meme par les arguments, d'une classe a l'autre et une forme d'heritage.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Si les patron de conception te parle, alors, je crois que Singleton est fais pour toi !

    Il est très utilisé pour la gestion des connexions a une bdd.

    Après tu peux l'utilisé n'importe ou dans ton appli en faisant un simple

    MaClassConnexionLDAP::getInstance(); ||
    MaClassConnexionMySQL::getInstance(); ||
    MaClassConnexionOracle::getInstance();

    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
     
    <?php 
    class MaClassConnexionMySQL { 
      private static $_instance = null; 
     
      private function __construct() { 
        // ici tu ouvre ta connexion 
      } 
     
      public static function getInstance() { 
        if ( is_null(self::$_instance) ) { 
          self::$_instance = new MaClassConnexionMySQL(); 
          } 
        return self::$_instance; 
        }
     
      public function __destruct() {
        // Pour faire les choses proprement
        ici tu met le code de déconnection si tu ne sérialise pas la ressource
      }
     
      public function __clone() {
          die("Clonage d'un singleon Interdit car le but c'est de tout le temps utilisé la meme instance");
      }
      } 
    ?>

  10. #10
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    Hello

    En fait, les patrons de conception ne me parles pas (encore!), mais ca me semble puissant, et ca résoud ENFIN le problème que je me pose depuis... pfiou... au moins! lol. Donc je vais sérieusement regarder de ce coté la

    Merci.
    Onet
    ---
    Retrouvez tout mes tutos et mes articles: http://www.olivierlange.com

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 173
    Points
    173
    Par défaut
    Il existe pas mal de best practice te permettant de choisir le pattern adéquat en fonction de ce que tu cherches a faire.

    UML POWAAAAAA lol si mon ancien prof d'UML m'entendait dire ca (Souvenir des tolles en partiel). Un petit tour en SSii a maturé tout ca lol

  12. #12
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    Citation Envoyé par lespoches Voir le message
    UML POWAAAAAA lol si mon ancien prof d'UML m'entendait dire ca (Souvenir des tolles en partiel). Un petit tour en SSii a maturé tout ca lol
    +1. Mais va faire comprendre ca a un client ou a un chef de projet que oui, 5jours sans toucher un ordinateur, et ne faire que de l'UML... lol!

    Onet
    ---
    Retrouvez tout mes tutos et mes articles: http://www.olivierlange.com

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

Discussions similaires

  1. [PHP 5.3] POO : Connexion BDD
    Par gwendoline-bricout dans le forum Langage
    Réponses: 7
    Dernier message: 05/02/2014, 21h31
  2. POO classe connexion à la DB en PDO
    Par Dvlop.com dans le forum Langage
    Réponses: 0
    Dernier message: 29/06/2011, 20h38
  3. [POO] class connexion et gestion BDD
    Par Melaus dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2008, 14h03
  4. [POO] POO pour une classe PDO
    Par nabab dans le forum Langage
    Réponses: 2
    Dernier message: 07/08/2007, 23h58
  5. Réponses: 2
    Dernier message: 09/10/2005, 15h35

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