Conventions pour le codage des classes en PHP

Conventions pour le codage des classes en PHP - PHP - Programmation

Marsh Posté le 31-03-2008 à 14:35:59    

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
Reply

Marsh Posté le 31-03-2008 à 14:35:59   

Reply

Marsh Posté le 31-03-2008 à 15:24:18    

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
Reply

Marsh Posté le 31-03-2008 à 15:56:04    

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 -
Reply

Marsh Posté le 31-03-2008 à 17:02:54    

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 ?
 

Reply

Marsh Posté le 31-03-2008 à 17:12:17    

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 -
Reply

Marsh Posté le 31-03-2008 à 17:14:50    

'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 -
Reply

Marsh Posté le 31-03-2008 à 22:28:31    

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 ?

Reply

Marsh Posté le 01-04-2008 à 11:30:12    

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
Reply

Marsh Posté le 01-04-2008 à 11:34:09    

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 -
Reply

Marsh Posté le 01-04-2008 à 11:55:44    

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
Reply

Marsh Posté le 01-04-2008 à 11:55:44   

Reply

Marsh Posté le 01-04-2008 à 21:31:29    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed