[PHP objet] p'tit coup de main !

p'tit coup de main ! [PHP objet] - PHP - Programmation

Marsh Posté le 28-02-2007 à 19:11:17    

Hello,
 
je réalise un projet en php objet et j'aimerai quelques précisions !
 
voilà ce que je suis en train de faire :
 
Je dois tout d'abord gérer des membres.
 
J'ai un fichier membre.php dont voici le résumé :

Code :
  1. <?php
  2. $member = new member(0, 'xx', 'xx', 'xx', 'xx', 0);
  3. if (!isset($_SESSION['ID'])) {
  4. // the visitor has to login if he want to see the dictionnary
  5. echo '<h3>You have ton logon to access this page.</h3>';
  6. $member -> logon();
  7. }
  8. elseif (isset($_GET['log'])) {
  9. // member connection
  10. }
  11. elseif (isset($_GET['unlog'])) {
  12. // member disconnection
  13. }
  14. elseif (isset($_GET['register'])) {
  15. // register a new member
  16. }
  17. elseif (isset($_GET['modify'])) {
  18. // modify a member
  19. }
  20. elseif (isset($_GET['delete'])) {
  21. // delete an member
  22. }
  23. elseif (isset($_GET['forget_password'])) {
  24. // the members has forget his password
  25. }
  26. ?>


 
Et un autre fichier membre.classes.php ou il y a toutes les fonctiones relatives au membres (dont le constructeur).

Code :
  1. class member
  2. {
  3. var $id;
  4. var $login;
  5. var $name;
  6. var $surname;
  7. var $mail;
  8. var $status;
  9. function member ($id, $login, $name, $surname, $mail, $status)
  10. {
  11.  $this->id=$id;
  12.  $this->login=$login;
  13.  $this->name=$name;
  14.  $this->surname=$surname;
  15.  $this->mail=$mail;
  16.  $this->status=$status;
  17. }
  18. function logon()
  19. {
  20.  // formulaire pour se connecter
  21. }
  22. function isAdmin()
  23. function infosMembres()
  24. ........
  25. // et plein d'autres fonctions...


 
Donc pour utiliser toutes les fonctions relatives aux membres je dois construire un objet. Pas très judicieux je trouve. Je suis sur la bonne voie ou je me plante totalement ?

Reply

Marsh Posté le 28-02-2007 à 19:11:17   

Reply

Marsh Posté le 28-02-2007 à 19:57:03    

Les code qui est dans ton membre.php ne sert pas a grand chose puisque tu sort du declaratif.

 

Pour garder du code propre dans tes clients tu utilises des methodes statiques.

 
Code :
  1. abstract class user{
  2. $uMap = array ( 'droit1' => $v,
  3. ....);
  4. protected  $username;
  5. protected $level;
  6. //quelques fonctions abtraites
  7. // variable communes a tous les user parlant du comportement de la classe user
  8. public function isLogged($param){}
  9. public function getUserLvl(){}
  10. }
  11. class admin extends user{
  12. //var unique propre a admin
  13. protected $userid;
  14. public function isAdmin(){}
  15. //tout ce que admin peut faire
  16. }
  17. class UserFactory {}
  18. /* code client */
  19. // autoload ou require ....
  20. $u = UserFactory::getUser($sid);
  21. if($u->authorize == true ||  ... === 'true')
  22. //blabla
 

C est un framework de base  que j utilise tout le temps et qui marche tres bien. Apres tu px rajouter des methode dans la factory pour avoir une sorte de chef d orchestre.

 

Dsl pour les fautes qwerty pwnz


Message édité par supermofo le 28-02-2007 à 20:01:32
Reply

Marsh Posté le 28-02-2007 à 20:12:08    

Je n'ai pas tout compris, je sors du déclaratif, c'est à dire?
 
Je dois mettre tout ce qui est dans membre.php dans une classe main?

Reply

Marsh Posté le 28-02-2007 à 21:03:36    

J'ai vu (et fait) pire lors de premières conceptions objet, mais c'est pas tout à fait ça là ;)
 
Déjà, quitte à commencer un projet, met toi à PHP5 plutôt que PHP4. PHP5 est beaucoup plus adapté que PHP4 pour faire de l'objet (visibilité des variables et fonction, passage par référence, etc, etc ...);
 
Ensuite tu vois que là tu mélanges de l'objet (membre.classes.php) et du non-objet (membre.php). Tu viens de tomber sur le premier (mais pas le dernier) problème à faire de l'objet en PHP.
Pour le résoudre, il te faut un point d'entrée à ton application, un "controller" qui va lancer les actions, un truc qui correspondrait au main en java. Exemple :  
dans l'index :  

Code :
  1. $controller = new Controller;
  2. $controller->execute();


Et le controller :  

Code :
  1. class Controller
  2. {
  3.     public function execute()
  4.     {
  5.         //le code que tu mets dans membre.php,  
  6.         //enfin plus ou moins ;)
  7.     }
  8. }


C'est assez basique comme exemple, mais donc là tu vas faire du tout objet à l'exception de 2 lignes dans l'index. L'intéret est grand : un seul point d'entrée dans ton application signifie un seul endroit à modifier pour modifier toute l'application, etc, etc.
 
Et donc avec cette ptite intro, tu tombes dans l'apprentissage des "design pattern". Je t'"invite à lire en entier ce topic : http://forum.hardware.fr/hfr/Progr [...] 7425_1.htm
C'est hardu au début, mais si tu cherches à te renseigner sur tout  ce que tu ne comprends pas ça viendra.
 
Je passes sur les méthodes de ta classe Member, parce que on va tomber dans des débats sur la POO ; moi, je ne ferais pas comme ça, mais j'ai déjà vu pire que ce que tu fais et faut bien commencer.
 
Ce que te montre supermofo ("factory pattern", enfin un d'entre eux) est à mon avis mal adapté : nul besoin d'utiliser des méthodes statiques. Et à mon sens c'est une bien piètre utilisation du factory pattern : c'est plutôt utile quand tu as le choix entre plusieurs objets pour la même action (par exemple, un objet qui va générer du html à partir de données, et un autre objet avec exactement les mêmes méthodes mais qui génère du pdf ; c'est le factory qui déterminera lequel instancier et tu n'as plus à t'en préoccuper dans le code). Là, utiiser une méthode statique pour instancier une classe du Model layer ... mouais pourquoi pas hein, je vois pas l'intéret :/


Message édité par Djebel1 le 28-02-2007 à 21:13:57
Reply

Marsh Posté le 28-02-2007 à 23:42:47    

J'ai pas trop envie de rendre la tache de Fused plus difficile.

 

Par contre Djebel tu tapes sur un point sensible. Factory = decoupler instantiation de l'utilisation.

 

Entre utiliser

Code :
  1. $a = new User();
  2. $a->execute();


Mauvais usage : melanger de la logique et de l'instantiation.
ou

Code :
  1. $fact = new UserFact();
  2. $a = $fact->getUser();
  3. $a->execute()


Mauvais usage : trop de code, copie d'objet au lieu de reference
ou

Code :
  1. $a=UserFact::getUser();
  2. $a->execute()


Mauvais usage : trop de statique = procedural

 

J'utilise la troisieme pour  commodite, pour mes exceptions et pour etre plus comprehensible.

 

Edit: Pas motive pour detailler plus ;)


Message édité par supermofo le 28-02-2007 à 23:45:21
Reply

Marsh Posté le 28-02-2007 à 23:47:15    

Pas besoin de faire une méthode statique pour ça, tu peux par exemple faire une classe Factory qui est instanciée dans le constructeur de ton controller, et ensuite appeler une méthode publique de cette classe Factory quand tu le souhaites.
Les méthodes statiques autant éviter de les utiliser quand c'est pas nécessaire.
 
Au passage je pense qu'il y a pas de problème à mélanger de la logique et de l'instantiation, surtout quand tu instancie une classe du Model layer. Dans le cas d'une classe du Model layer, c'est vraiment uniquement pour ne pas se taper une ligne d'include ou d'autoload ^^


Message édité par Djebel1 le 28-02-2007 à 23:48:55
Reply

Sujets relatifs:

Leave a Replay

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