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] associer base de données et classe


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut [POO] associer base de données et classe
    Bonjour,

    Je commence la programmation orientée objet en PHP avec utilisation d'une base de données. Cependant, je ne sais pas si ma manière d'aborder le problème est correcte en ce qui concerne la façon de gérer les échanges avec la base de données.

    Je vais prendre un exemple simplifié volontairement.

    Ma base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Article(id, titre, contenu)
    Ma 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
    29
    30
    31
    32
    33
    34
    35
    class Article
    {
    	private $id;
    	private $titre;
    	private $contenu;
     
    	function __construct($id)
    	{
    		// je construis mon objet en faisant une requête dans ma base de données
    		// puis en affectant les résultats de la requête aux champs de mon objet
    		$this->id = $id;
    		$this->titre = $mesDonnes->titre;
    		$this->contenu = $mesDonnees->contenu;
    	}
     
    	/* accesseurs */
    	/* mutateurs */
     
    	public miseAJourSql()
    	{
    		// mise à jour de mon objet dans la base de données en fonction de la valeur des attributs de l'objet instancié
    		mysql_query('UPDATE article SET titre="'.$this->titre.'", contenu="'.$this->contenu.'" WHERE id='.$this->id);
    	}
     
    	/* Méthodes statiques */
    	public static function supprimerSql($unId)
    	{
    		// suppression de l'id passé en paramètre dans ma base de données
    	}
    	public static function getLesArticles()
    	{
    		// effectue une requête dans la base de données
    		// puis retourne une collection d'articles
    	}
    }
    Pour la suppression ou la liste d'artilces, j'utilise une méthode statique vu qu'il n'est pas nécessaire d'instancier d'objet.

    Ce mode de fonctionnement est-il "correct", mauvais ou à améliorer ?
    Avez-vous de meilleures façon de faire à me conseiller ?

    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Par défaut
    Bonjour,

    j'y ajouterais au minimum des contrôles sur les données, une protection de type htmlspecialchars ou autre. J'imagine que tu le fais dans les mutateurs...

    Un nommage des méthodes génériques plus explicite et/ou conventionnel :

    article->create(), article->update(), article->delete(), article->getAll()....

    et surtout une gestion des exceptions...

    tu instancies la classe avec un ID, dans ce cas, tu ne vises pas la possibilité de créer un nouvel enregistrement. j'aurais mis une valeur par défaut au paramètre de manière à tester sa valeur et détecter une création... ou alors testes au moins son existence avant de tenter d'aller chercher son contenu en base.



  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Citation Envoyé par ska_root Voir le message
    Bonjour,

    j'y ajouterais au minimum des contrôles sur les données, une protection de type htmlspecialchars ou autre. J'imagine que tu le fais dans les mutateurs...

    Un nommage des méthodes génériques plus explicite et/ou conventionnel :

    article->create(), article->update(), article->delete(), article->getAll()....

    et surtout une gestion des exceptions...

    tu instancies la classe avec un ID, dans ce cas, tu ne vises pas la possibilité de créer un nouvel enregistrement. j'aurais mis une valeur par défaut au paramètre de manière à tester sa valeur et détecter une création... ou alors testes au moins son existence avant de tenter d'aller chercher son contenu en base.


    Merci pour ta réponse ska_root. Pour les contrôles et protections, rassure-toi ils sont faits (d'ailleurs je suis passé sous PDO et requêtes préparées ). C'est juste que j'ai refait une classe d'exemple ici de mémoire (je n'ai pas ma classe sur moi).

    Tu fais bien d'aborder l'histoire du nouvel enregistrement : je voulais au départ faire de la surcharge de constructeur, mais je me suis retrouvé face à une erreur fatale et j'ai constaté qu'il n'était apparemment pas possible d'en faire en PHP

    Au final, j'ai procédé comme tel (toujours de mémoire et simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function __construct($id, $titre = '', $contenu = '')
    {
    	if($id != 0)
    	{
    		// création depuis la bdd
    	}
    	else
    	{
    		// affectation des champs depuis les paramètres
    	}
    }
    Sinon, à part ces éléments, la démarche est correcte en ce qui concerne les accès (insert, update, getAll en statique...) à la base de données ?

  4. #4
    Membre Expert
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
     
    class Article {
     
     
    	public $title="";
    	public $contenu="";
    	public $id="";
     
    	public function __construct($id=0, $title="", $contenu="") {
    		$this->title= $title;
    		$this->contenu= $contenu;
    		$this->id= $id;
    	}
     
    	public function getMethod() {
    		if(!$this->id) echo "Article :: Creation d'un nouvel article";
    		else echo "Article :: Modification de l'article ".$this->id;
    	}
     
    }
     
    // creation
    echo "<h3>Creation</h3>";
    $article = new Article();
    $article->getMethod();
     
    echo "<hr/>";
    echo "<h3>Modification</h3>";
    $article= new Article(222);
    $article->getMethod();
     
    ?>
    sinon oui, la méthode peut-être statique pour le getAll et pourquoi pas le delete...


  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Comme le dit ska_root toutes les méthodes d'accès/extraction de données peuvent être statiques.
    En extraction (SELECT), tu récupères généralement un tableau, en accès (INSERT, UPDATE, DELETE) tu récupères généralement soit un boolean soit un integer. Donc le corps de ta classe peut se résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Article {
       static function insert(array $p) { }
       static function update(array $p) { }
       static function delete($pId) { }
       static function select(array $pWhere) { }
    }
    et les appels à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Article::insert($p); ...
    Enfin ceci n'est qu'un exemple pour te montrer que l'accès aux données peut ne dépendre d'aucune instance de classe

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 36
    Par défaut
    Ca reste quand même une bonne idée d'instancier les objets pour effectuer des actions ayant trait à la persistance.

    L'utilisation de méthodes statiques est en général plutôt utilisée quand on a une classe "enregistreuse" séparée, qui a par exemple une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public static function delete(MyObject $object){
        //code qui effectue la suppression
     }
    En effet, l'id dans l'absolu est juste un nombre, il ne prend son sens métier qu'au sein d'une instance.

    L'exception est le cas où nous avons vraiment besoin de limiter au minimum nécessaire les instanciations. Je n'ai jamais rencontré un cas avec suffisamment de données pour que ce soit significatif en php.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 96
    Par défaut
    Citation Envoyé par floriann Voir le message
    Je commence la programmation orientée objet en PHP avec utilisation d'une base de données. Cependant, je ne sais pas si ma manière d'aborder le problème est correcte en ce qui concerne la façon de gérer les échanges avec la base de données.
    Salut Florian,

    la methode delete peut etre static dépendamment du contexte, mais avant d'y penser je te conseillerais de lire un peu sur le dao pattern.

    Comme tu dit, tu commence a faire de la poo, et pour un début cest assez bien, tu as penser a diviser le read(getLesArticles), write(oups...), delete(supprimerSql) update(miseAJourSql)

    Si tu détermine/précise, en debut de class, la structure de ton objet

    ex : var property = array(ID,titre,text...), un dao pattern sert a mapper cest dite valeur pour de façons generique creer en autre le read write del...

    il y a plusieur tuto sur le net sur le sujet, par la suite tu pourrais aussi séparer ton sql de ton objet au moyen dune class database tel pdo par exemple qui permet de faire de lactive record, un autre design pattern tres utilise.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Bonjour à vous,

    Merci pour toutes vos réponses.

    @ Xysyo et jonoz :
    Je me rappelle être une fois tombé sur un programme où le mode de fonctionnement me surprenait, avec des choses du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $maClasse = new MaClasse();
    $maClasse->delete();
    Avec comme seule utilisation de la méthode de suppression ; d'où mon idée de passer ça en statique vu que l'instanciation me semblait alors inutile.

    @ gene69 :
    Je faisais bien référence à la notion de surcharge de constructeur.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MaClasse
    {
          function __construct($id)
          {
                // construction de ma classe depuis la bdd
          }
          function __construct($champ1, $champ2, $champ2)
          {
                // construction de ma classe à partir des paramètres
          }
    }
    Le code ci-dessus n'est pas accepté par PHP. Y a peut-être une autre méthode ?

    @ nault :
    Je vais me documenter sur cela, merci

Discussions similaires

  1. POO et base de données incompréhension
    Par hideadlock dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/04/2013, 10h44
  2. Base de données et classe PreparedStatement
    Par bandit_debutant dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 06/06/2008, 12h49
  3. formulaire / php / base de données et classes
    Par No3l_tek dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2008, 09h52
  4. POO et bases de données
    Par szdavid dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 24/01/2006, 15h37

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