Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1221 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Conventions pour le codage des classes en PHP

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conventions pour le codage des classes en PHP

n°1710310
tostiere
Posté le 31-03-2008 à 14:35:59  profilanswer
 

Bonjour,
depuis quelque temps je me suis mis à la programmation avec les classes en PHP.
 
Cependant, ayant encore trop de reflexes de programmation procédurale, j'aimerais quelques conseils.
 
Alors, déjà voici un exemple de classes d'un projet sur lequel je travaille :
 
Classe affichage :
 

Code :
  1. <?php
  2. class Affichage
  3. {
  4. protected $connexion;
  5. protected $base;
  6. function __construct($bdserveur, $bduser, $bdpass, $bdnom)
  7. {
  8.  $this->connexion = mysql_connect($bdserveur, $bduser, $bdpass) or die("Erreur de connexion" );
  9.  $this->base = $bdnom;
  10. }
  11. function __destruct()
  12. {
  13. }
  14. }


 
 
classe AffichageUser
 

Code :
  1. <?php
  2. class AffichageUser extends Affichage
  3. {
  4. function __construct($bdserveur, $bduser, $bdpass, $bdnom)
  5. {
  6.  parent::__construct($bdserveur, $bduser, $bdpass, $bdnom);
  7. }
  8. function __destruct()
  9. {
  10.  parent::__destruct();
  11. }
  12. public function getNomUser($login_user)
  13. {
  14.  $requete  = "SELECT nom FROM user WHERE login = '$login_user'";
  15.  $resultat = mysql_db_query($this->base, $requete, $this->connexion);
  16.  $nom = mysql_fetch_array($resultat);
  17.  return $nom['nom'];
  18. }
  19. }


 
 
 
Bien-entendu ce n'est qu'un exemple. Je pense que vous vous en doutez où je veux venir :
 
Est-ce que ce codage là est correct ? (ce dont je doute).
Est-ce que l'heritage est superflu dans ce genre de cas ?
 
Est-ce qu'il vaut mieux que je passe tous les paramètres (connexion, login_user, etc...) au moment de l'instanciation et me servir d'attributs pour appeler les méthodes ?
 
Enfin, est-ce qu'il serait préferable que je fasse une classe "connexion" que j'instancie dans une variable, et que je passe cette variable en parametre dans le constructeur de la classe qu'il me faudra par la suite ?
 
Pouvez-vous me donner un exemple, comment auriez-vous fait ?
 
 
Merci d'avance à ceux qui répondront, ça m'aiderait à comprendre certaines choses  :)


Message édité par tostiere le 31-03-2008 à 14:36:39
mood
Publicité
Posté le 31-03-2008 à 14:35:59  profilanswer
 

n°1710385
art_dupond
je suis neuneu... oui oui !!
Posté le 31-03-2008 à 15:24:18  profilanswer
 

Je ferais comme toi mais je donnerais des autres noms à mes classes (class DB, class DB_User) :p
 
Sinon je pense que le constructeur de la deuxième classe hérite automatiquement de l'autre constructeur.
 
 
ps: mais je suis aussi nioub en POO ;) (mais bon, pour le super avis que je donnes :p)


---------------
oui oui
n°1710426
skeye
Posté le 31-03-2008 à 15:56:04  profilanswer
 

Je ne suis pas très fan du découpage, mais bon ça peut être bien comme tu as fait...perso j'aurais plutôt un truc qui ressemblerait à ça (fait à l'arrache hein)

 
Code :
  1. class Db
  2. {
  3.     private $server;
  4.     private $pass;
  5.     private $user;
  6.     private $name;
  7.     private $connexion;
  8.     
  9.     
  10.     function __construct($bdserveur, $bduser, $bdpass, $bdnom)
  11.     {
  12.         $this->server = $bdserveur;
  13.         $this->user = $bduser;
  14.         //...
  15.         $this->connexion = false;
  16.     }
  17.     
  18.     function connect(){
  19.         if(!$this->connexion){
  20.             $this->connexion = mysql_connect($this->server, $this->user, $this->pass);
  21.             if(!$this->connexion){
  22.                 throw new Exception('connexion ratée, au-secours.');
  23.             }
  24.             mysql_select_db($name);
  25.         }
  26.     }
  27.     
  28.     function execSql($sql){
  29.         //on exécute la requête $sql on on retourne les rows sous foprme de tableau...
  30.     }
  31.     
  32. }
  33.  
  34. class User
  35. {
  36.     private $db;
  37.     
  38.     function __construct(Db $dbInstance)
  39.     {
  40.         $this->db = $dbInstance;
  41.     }
  42.  
  43.     public function getNomUser($login_user)
  44.     {
  45.         try{
  46.             $this->db->connect();
  47.             $requete  = "SELECT nom FROM user WHERE login = '$login_user'";
  48.             $resultats = $this->db->execSql($requete);
  49.         }
  50.         catch(Exception $e){
  51.             die($e->getMessage());
  52.         }
  53.         
  54.         return $resultats[0]['nom'];
  55.     }
  56.  
  57. }


Message édité par skeye le 31-03-2008 à 15:57:40

---------------
Can't buy what I want because it's free -
n°1710482
tostiere
Posté le 31-03-2008 à 17:02:54  profilanswer
 

Merci pour vos réponses :) Comme vous m'avez donné pratiquement la même réponse, je pense que je vais adopter cette manière-là.
 
Si je comprends bien, l'heritage dans ce genre de cas vaut mieux éviter ?
 
Cependant, je me pose encore la question : pour la fonction "getNomUser" est-ce que c'est "propre" de laisser un tel paramètre ?  
Ou faudrait-il plutôt le mettre dans l'appel du constructeur ?
 

n°1710494
skeye
Posté le 31-03-2008 à 17:12:17  profilanswer
 

tostiere a écrit :

Merci pour vos réponses :) Comme vous m'avez donné pratiquement la même réponse, je pense que je vais adopter cette manière-là.

 

Si je comprends bien, l'heritage dans ce genre de cas vaut mieux éviter ?

 

Cependant, je me pose encore la question : pour la fonction "getNomUser" est-ce que c'est "propre" de laisser un tel paramètre ?
Ou faudrait-il plutôt le mettre dans l'appel du constructeur ?

 


 

Ne pas avoir d'héritage là c'est plutôt une question de logique : a priori ce ne sera pas la seule classe à utiliser la base de données, si tu dois passer tous ces paramètres strictement identiques à tous tes objets t'es pas sorti... ;)

 

Pour la question suivante ça dépend de ce que tu veux faire - du sens que tu veux donner à ta classe.
Si une instance de cette classe doit représenter un utilisateur de ton appli, alors ce que j'ai fait n'est pas la "bonne" solution. La classe User que j'ai faite plus haut serait faite uniquement pour interagir avec la représentation d'un utilisateur en base de données. On pourrait la renommer en "UserDbFactory" par exemple.


Message édité par skeye le 31-03-2008 à 17:12:53

---------------
Can't buy what I want because it's free -
n°1710500
skeye
Posté le 31-03-2008 à 17:14:50  profilanswer
 

'fin c'est une question bien plus complexe, si on veut rentrer dans le détail et une implémentation complète...


---------------
Can't buy what I want because it's free -
n°1710713
tostiere
Posté le 31-03-2008 à 22:28:31  profilanswer
 

Merci pour ton attention skeye :)
 
Alors en fait la classes User c'est uniquement pour intéragir avec la base de données, donc ce que tu as fait est bien à priori.
 
Sinon je n'ai pas très bien compris ta réponse concernant l'héritage. Si je fais instancier à chaque fois la classe "Db" y a t-il vraiment un problème ? Ou faut-il que je la fasse hériter ?

n°1710888
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 11:30:12  profilanswer
 

est-ce mal de faire quelque chose comme ça ?
 

Code :
  1. class DB
  2. {
  3.    function __construct()
  4.    {
  5.       connection à la base
  6.    }
  7.    public function select()
  8. }
  9. class DB_user extends DB
  10. {
  11.    public function select_user()
  12.  
  13. }
  14. class User
  15. {
  16.     public function login($login,$pwd)
  17.    {
  18.       $user = news DB_user;
  19.       if($user->select_user)
  20.       {
  21.           OK
  22.       }
  23.       else
  24.       {
  25.           PROUT
  26.       }
  27.    }
  28. }


 
Le but étant d'avoir la classe User la plus lisible possible et aussi d'avoir toutes les classes DB_* contenant les requêtes rassemblée en un endroit.


---------------
oui oui
n°1710893
skeye
Posté le 01-04-2008 à 11:34:09  profilanswer
 

non, ce n'est pas mal. Enfin pas trop.
Mais personnellement je mettrais plutôt une méthode getUserFromLoginAndPasswd() - bon ok p-e un nom plus simple :D - qui retourne un User dans DB_user...ça permet de ne pas avoir du tout de référence à la source de données dans User.


Message édité par skeye le 01-04-2008 à 11:34:44

---------------
Can't buy what I want because it's free -
n°1710923
art_dupond
je suis neuneu... oui oui !!
Posté le 01-04-2008 à 11:55:44  profilanswer
 

oui c'est ce que je fais :)

 

j'ai juste donné le schémas en gros

 


merci :jap:


Message édité par art_dupond le 01-04-2008 à 11:55:59

---------------
oui oui
mood
Publicité
Posté le 01-04-2008 à 11:55:44  profilanswer
 

n°1711282
tostiere
Posté le 01-04-2008 à 21:31:29  profilanswer
 

OK merci pour vos indications je verrai ça de plus près alors :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Conventions pour le codage des classes en PHP

 

Sujets relatifs
classes dérivées et pointeurs[PHP] Petit soucis de tableau d'un objet
XML DOM avec PHPIntéraction Php (mysql) et Javascript
problème de classes qui s'incluent entre elles[PHP] résolu - impossible de recupérer les $_POST
[HTML/PHP] question "normes de codage"le Codage canonique de Huffman
Plus de sujets relatifs à : Conventions pour le codage des classes en PHP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR