[PHP] La redéfinition est-elle possible ou pas ?

La redéfinition est-elle possible ou pas ? [PHP] - PHP - Programmation

Marsh Posté le 20-02-2008 à 11:25:52    

Hello,
 
Je me lance, pour m'occuper, progresser et ne pas perdre les notions que j'ai déjà, dans le développement d'un genre de CMS en PHP objet. J'essaie donc pour le moment pas mal de choses, mais je me confronte à un problème pénible. J'ai une classe (User) que j'aimerai faire réagir différemment en fonction des paramètres passés à son contructeur.
Typiquement, voila ce que j'essai de faire :
 

Code :
  1. class User {
  2. public function __construct() {
  3. }
  4. public function __construct($var1) {
  5. }
  6. public function __construct($var1, $var2) {
  7. }
  8. }


 
Problème, je reçois un message d'erreur sous la forme :

Cannot redeclare User::__construct()


 
Il me semblait que l'objet permettait en théorie de réaliser ce genre de chose, avec sélection automatique du construsteur à utiliser en fonction du nombre de paramètres et de leurs types (dans le cas d'un langage typé biensur, donc off pour PHP). Je tourne avec PHP5, et j'ai beau consulter la doc, je ne vois aucun cas ou cette technique est utilisée.
 
PHP serait-il incapable d'utiliser la redéfinition ?
 
Merci d'avance.


---------------
Au coeur du swirl - Mon feed
Reply

Marsh Posté le 20-02-2008 à 11:25:52   

Reply

Marsh Posté le 20-02-2008 à 11:30:44    

Gagne, de toutes facons, je vois pas tellement comment ce serai gerable avec un langage qui ne type pas ses variales. Par contre, tu peux utiliser des valeurs par defaut et faire un zouli case  

Code :
  1. public function truc($var1 = -1, $var2 = -1) {
  2.    if ( $var1 == -1 ) {
  3.       // Appel a truc sans parametres
  4.    }
  5.    else if ( $var2 == -1 ) {
  6.       // Appel a truc avec 1 seul parametre
  7.    }
  8.    else {
  9.       // Appel a truc avec 2 parametres
  10.    }
  11. }


Gaffe quand meme a ce que -1 ne soit pas une valeur de parametre valide.

Reply

Marsh Posté le 20-02-2008 à 11:34:25    

C'est vrai que sans le typage, c'est chaud, mais ça m'aurait suffit que ça fonctionne avec le nombre de paramètres :/ Chiotte, bon, ben je vais voir ça d'une autre manière alors, mais pour le coup ça m'emmerde un peu. Je vais essayer de voir avec ta méthode, merci pour le coup de pouce.


---------------
Au coeur du swirl - Mon feed
Reply

Marsh Posté le 20-02-2008 à 11:34:44    

La surcharge d'opérateurs n'existe pas en php.
Il y a moyen de tricher avec les fonctions magiques __set, __get, __call, mais c'est du bricolage amha :
http://fr3.php.net/manual/fr/langu [...] oading.php


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-02-2008 à 15:20:36    

A vrai dire, le but du jeu était de créer un objet User en récupérant (ou pas) ses informations dans une base de données MySQL suivant le nombre de paramètres fourni au constructeur. Genre, contruct() pour créer un objet User vide, contruct(<mes variables> ) pour créer un objet à partir des identifiants.
Je pense donc pouvoir faire un seul constructeur avec paramètres, et tester éventuellement si le paramètre d'identifiant de l'utilisateur est nul ou défini. Pensez-vous que la méthode soit "clean" ?


---------------
Au coeur du swirl - Mon feed
Reply

Marsh Posté le 20-02-2008 à 15:32:22    

C'est à peu près aussi clean qu'on peut le faire en php.
Sinon tu peux tenter ce que j'ai mis plus haut, du genre avec __call , même si perso j'aime pas - et faut que __call soit appelé aussi en cas d'absence de __construct(), et j'ai jamais testé:

 
Code :
  1. class User{
  2.  
  3. public function __call($m, $a){
  4.  
  5. if($m == '__construct'){
  6. $nb_parameters=count($a);
  7. switch($nb_parameters){
  8.  case 0: $this->constructeur0(); break;
  9.  case 1 : $this->constructeur1($a[0]); break;
  10.  default: $this->constructeur0();
  11. }
  12.  
  13. }
  14.  
  15. }
  16.  
  17. function constructeur0(){
  18. ...
  19. }
  20.  
  21. function constructeur1($param){
  22. ...
  23. }
  24.  
  25. }


Message édité par skeye le 20-02-2008 à 15:32:53

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-02-2008 à 15:36:48    

de mon coté j'utilise une classe UserFactory

 

qu iva avoir plusieurs methodes:

  • getById($idUser)
  • create($params)

...

 

cette classe se charge de creer le bon user et d'appeller les setter qui vont bien par la suite. Mais c'ets pas bcp plus propre que l'appel a call

Message cité 1 fois
Message édité par flo850 le 20-02-2008 à 15:36:56

---------------

Reply

Marsh Posté le 20-02-2008 à 15:50:37    

flo850 a écrit :

de mon coté j'utilise une classe UserFactory  
 
qu iva avoir plusieurs methodes:

  • getById($idUser)
  • create($params)

...
 
cette classe se charge de creer le bon user et d'appeller les setter qui vont bien par la suite. Mais c'ets pas bcp plus propre que l'appel a call


 
C'est la solution que j'ai adoptée aussi pour la plupart des choses.
La classe User a un seul constructeur, et c'est à la factory de se démerder pour lui filer les bons paramètres...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-02-2008 à 15:58:10    

et un array en paramètre?

Message cité 2 fois
Message édité par soulmanto le 20-02-2008 à 15:58:23
Reply

Marsh Posté le 20-02-2008 à 16:00:25    

soulmanto a écrit :

et un array en paramètre?


ça revient au même que le __call - perso je trouve ça très moche.[:petrus75]

Message cité 2 fois
Message édité par skeye le 20-02-2008 à 16:00:41

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-02-2008 à 16:00:25   

Reply

Marsh Posté le 20-02-2008 à 16:35:39    

Je prend note de toutes ces méthodes :)
 
Après, pour mon cas pratique, le fait que je n'ai besoin que de deux constructeurs se gère plus facilement avec un if qu'avec quelque chose de plus complexe comme le call, et ça permet d'utiliser le contruct sans se poser de question et sans redéfinir deux fonction (construct et call).
 
Bref, ça reste du grand bidouillage, surtout quand on a pris ses habitudes avec un langage typé et qui supporte la redéfinition. Merci pour votre aide en tout cas :)


---------------
Au coeur du swirl - Mon feed
Reply

Marsh Posté le 20-02-2008 à 16:46:31    

soulmanto a écrit :

et un array en paramètre?

skeye a écrit :

ça revient au même que le __call - perso je trouve ça très moche.[:petrus75]


arf, merdouille c'est ce que j'aurai eu tendance à proposer aussi... bon ben je retourne me coucher travailler alors  :ange:  


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 21-02-2008 à 10:20:22    

skeye a écrit :


ça revient au même que le __call - perso je trouve ça très moche.[:petrus75]


 
Mouais, je trouve ça plutôt propre comme approche, ça évite une classe boiteuse...

Reply

Marsh Posté le 21-02-2008 à 10:53:46    

soulmanto a écrit :

 

Mouais, je trouve ça plutôt propre comme approche, ça évite une classe boiteuse...


Bah à la place t'as N fonctions aux noms différents qui font office de constructeurs et un switch géant comme réel constructeur qui appelle la fonction qui va bien...ou pire juste un énorme switch qui fait tout...je vois mal comment on peut faire plus boiteux...[:petrus75]


Message édité par skeye le 21-02-2008 à 10:54:54

---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

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