constructeur en PHP 5

constructeur en PHP 5 - PHP - Programmation

Marsh Posté le 25-09-2006 à 11:40:37    

Bonjour,
 
J'ai un souci de conception en PHP 5.
J'ai un objet qui peut être construit à partir d'en enregistrement contenu dans une BD ou à partir de valeurs passées en paramètres. Or, j'ai pas l'impression qu'on puisse surcharger le constructeur.
J'ai donc fait le truc suivant :  

Code :
  1. public function __construct($ModeConstruction, $ID, $Param1, $Param2...) {
  2.     switch($ModeConstruction) {
  3.         case 'FROM_DB':
  4.             // ici, j'initialise mon objet en chargeant les valeurs depuis la BD grâce à $ID
  5.             break;
  6.         default:
  7.             // ici, j'initialise mon objet à partir des valeurs $Param1, $Param2...
  8.             break;
  9.     }
  10. }


 
mais y'aurait pas mieux quand même comme méthode? Merci :jap:

Reply

Marsh Posté le 25-09-2006 à 11:40:37   

Reply

Marsh Posté le 25-09-2006 à 11:45:50    

et tu ne peux pas faire ta requête sur la BDD avant et ensuite rentrer les infos en paramètres ? auquel cas ça ne te ferais plus qu'un seul type de constructeur.. nan ?

Reply

Marsh Posté le 25-09-2006 à 11:51:52    

rufo > S'il n'est pas possible de surcharger le constructeur, alors fait deux classes dont une basé sur l'autre. ( mot clé "extends". Voir http://fr2.php.net/manual/fr/ref.classobj.php ) Ca aura au moins le mérite de ne pas te trimbaler 36 paramettre quand ils sont inutile et ce sans être obligé de réécrire deux fois le même code.
 
Une autre solution serait d'avoir des fonctions init() et init_db() qui te permettrait de charger les infos là où il faut et même de réinitialisé ton objet.

Reply

Marsh Posté le 25-09-2006 à 12:07:55    

Ou bien tu fais simplement deux factory methods.

Reply

Marsh Posté le 25-09-2006 à 12:39:56    

php5 ne supporte pas le polymorphisme ? Il me semblait que oui ?
 
tu ferais donc :  

Code :
  1. public function __construct($dbHandle){
  2. //ton code
  3. }
  4. //un autre constructeur pour l'autre cas
  5. public function __construct($param1, $param2, ...){
  6. //ton code
  7. }


 
Si php gère bien le polymorphisme, cette solution est plus élégante et plus pratique.

Reply

Marsh Posté le 25-09-2006 à 12:49:42    

c0wb0y a écrit :

php5 ne supporte pas le polymorphisme ? Il me semblait que oui ?
 
tu ferais donc :  

Code :
  1. public function __construct($dbHandle){
  2. //ton code
  3. }
  4. //un autre constructeur pour l'autre cas
  5. public function __construct($param1, $param2, ...){
  6. //ton code
  7. }


 
Si php gère bien le polymorphisme, cette solution est plus élégante et plus pratique.


 
 
au début, c'est ce que je comptais faire. Mais il me semble que j'avais essayé et je m'étais fait jeter (redeclarerd function).

Reply

Marsh Posté le 25-09-2006 à 12:51:48    

gizmo a écrit :

Ou bien tu fais simplement deux factory methods.


 
c'est ce que fait mon constructeur il me semble. Suivant, la valeur du paramètre $Mode, je construis mon objet différemment (il appelle telle ou telle méthode). c'est bien le principe de la factory?

Reply

Marsh Posté le 25-09-2006 à 12:57:28    

rufo a écrit :

c'est ce que fait mon constructeur il me semble. Suivant, la valeur du paramètre $Mode, je construis mon objet différemment (il appelle telle ou telle méthode). c'est bien le principe de la factory?


oui, mais non. Ce qui tu fait, c'est une dérivée des factory, mais c'est lourd car cela impliqe des modification de cette méthode pour chaque nouveaux type d'élément.
 
Ce que j'imagine est plutôt du type

Code :
  1. protected function __construct() {
  2.   // du code générique
  3. }
  4. public static final function newObjectByDB(param1, param2, ...) {
  5.   // du code spécifique
  6.   $result = new Object(); // Object est ta classe
  7.   // du code spécifique
  8.   return $result;
  9. }
  10. public static final function newObjectByParam(param1) {
  11.   // du code spécifique
  12.   $result = new Object(); // Object est ta classe
  13.   // du code spécifique
  14.   return $result;
  15. }


Ainsi, tu découples ta création de ton objet de l'initialisation de tes paramètres de création et en cas de nouveau type de création, tu ne dois que créer une nouvelle factory sans rien toucher au reste.

Reply

Marsh Posté le 25-09-2006 à 13:26:57    

gizmo a écrit :

oui, mais non. Ce qui tu fait, c'est une dérivée des factory, mais c'est lourd car cela impliqe des modification de cette méthode pour chaque nouveaux type d'élément.
 
Ce que j'imagine est plutôt du type

Code :
  1. protected function __construct() {
  2.   // du code générique
  3. }
  4. public static final function newObjectByDB(param1, param2, ...) {
  5.   // du code spécifique
  6.   $result = new Object(); // Object est ta classe
  7.   // du code spécifique
  8.   return $result;
  9. }
  10. public static final function newObjectByParam(param1) {
  11.   // du code spécifique
  12.   $result = new Object(); // Object est ta classe
  13.   // du code spécifique
  14.   return $result;
  15. }


Ainsi, tu découples ta création de ton objet de l'initialisation de tes paramètres de création et en cas de nouveau type de création, tu ne dois que créer une nouvelle factory sans rien toucher au reste.


 
 
ok, j'ai compris. Oui effectivement, ça va le faire. Merci :jap:

Reply

Marsh Posté le 25-09-2006 à 17:21:15    

En PHP on utilise souvent des types de paramètre différents pour faire faire différentes choses à une fonction, car  il n'est pas possible de déclarer une fonction avec un nombre de paramètres différents.
Voir par exemple: http://fr.php.net/manual/fr/function.is-int.php
Utilise ensuite les paramètres par défaut pour faire varier le nombre de paramètres.
Une autre possibilité souvent utilisée, sans paramètres variables, est de prendre soit une array en paramètre, soit un entier. De plus, l'array peut éventellement contenir divers clés dont on connait alors les noms par avance, et ces derniers peuvent servir à aiguiller suivant différents algorithmes.
 
Ensuite, pour isoler les différents algorithmes de ton constructeur, tu peux utiliser plusieurs fonctions init() de la même façon que les factory présentées plus haut.

Message cité 1 fois
Message édité par nargy le 25-09-2006 à 17:24:21
Reply

Marsh Posté le 25-09-2006 à 17:21:15   

Reply

Marsh Posté le 26-09-2006 à 09:16:51    

nargy a écrit :

En PHP on utilise souvent des types de paramètre différents pour faire faire différentes choses à une fonction, car  il n'est pas possible de déclarer une fonction avec un nombre de paramètres différents.
Voir par exemple: http://fr.php.net/manual/fr/function.is-int.php
Utilise ensuite les paramètres par défaut pour faire varier le nombre de paramètres.
Une autre possibilité souvent utilisée, sans paramètres variables, est de prendre soit une array en paramètre, soit un entier. De plus, l'array peut éventellement contenir divers clés dont on connait alors les noms par avance, et ces derniers peuvent servir à aiguiller suivant différents algorithmes.
 
Ensuite, pour isoler les différents algorithmes de ton constructeur, tu peux utiliser plusieurs fonctions init() de la même façon que les factory présentées plus haut.


 
j'ai déjà utilisé ce genre de méthode, le coup de l'entier (ou pour faire plus lisible, une constante) qui indique l'algo à utiliser et le tableau contenant un nb de paramètres variables, dans le cas de fonctions de recherche multi-critères par ex (ça s'y prête bien). Par contre, dans le cas de la construction d'un objet, j'ai quand même une préférence pour les fonctions factory...
 
En tout cas, vivement le support complet de la surcharge des fonctions dans PHP :p


Message édité par rufo le 26-09-2006 à 09:17:50
Reply

Marsh Posté le 26-09-2006 à 22:52:25    

Citation :


En tout cas, vivement le support complet de la surcharge des fonctions dans PHP :p


Ça risque pas d'arriver puisque la méthode recommandée pour faire ça est la suivante:

Code :
  1. function fct($param, $param2 = 0)
  2. {
  3.   if(is_int($param))
  4.     ;// init à partir de la BDD
  5.   else
  6.     ;// init à partir des paramètres
  7. }


Ce qui n'a ABSOLUMENT rien à voir avec l'emploi de constantes. Mais alors VRAIMENT rien à voir.
 
PS: je me disais bien que si je ne postais pas de code mes explications pourraient être mal interprétées.

Reply

Marsh Posté le 27-09-2006 à 08:49:09    

Euh... recommandee ou? Et vu qu'il vont sans doute permettre le renforcement du typage dans les appels des fonctions, ca me laisse dubitatif.

Reply

Marsh Posté le 27-09-2006 à 11:19:00    

nargy a écrit :

Citation :


En tout cas, vivement le support complet de la surcharge des fonctions dans PHP :p


Ça risque pas d'arriver puisque la méthode recommandée pour faire ça est la suivante:

Code :
  1. function fct($param, $param2 = 0)
  2. {
  3.   if(is_int($param))
  4.     ;// init à partir de la BDD
  5.   else
  6.     ;// init à partir des paramètres
  7. }


Ce qui n'a ABSOLUMENT rien à voir avec l'emploi de constantes. Mais alors VRAIMENT rien à voir.
 
PS: je me disais bien que si je ne postais pas de code mes explications pourraient être mal interprétées.


 
ben si, un peu quand même. Dans ma première version de fonction, $param prenait comme valeur des constantes du genre FROM_DB (const valant 1), FROM_PARAMS (const vant 2), etc. et ensuite, je faisais un switch($param) suivi de "case FROM_DB", de "case FROM_PARAMS"... Ca rend plus lisible le code qu'une succession de if-elseif-else avec des tests du genre if ($param == 1), if ($param == 2), n'est-ce pas?  ;)  

Reply

Marsh Posté le 28-09-2006 à 00:23:50    

Je réitère: ça n'a rien à voir, même si c'est effectivement équivalent à l'emploi de constantes. C'est moins une question de performance (et pourtant si...) ou de facilité d'écriture (et pourtant aussi..), que de philosophie. C'est de cette manière que les fonctions natives de PHP fonctionnent, et il est donc naturel de coder de la même façon.
Celà ne restreint pas bien sûr les possibilités de programmation, mais en respectant cette règle: <<les types des arguments déterminent ce que fait la fonction>> celà permet une meilleure intégration des fonctions utilisateur.


Message édité par nargy le 28-09-2006 à 00:24:34
Reply

Sujets relatifs:

Leave a Replay

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