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

  FORUM HardWare.fr
  Programmation
  PHP

  constructeur en PHP 5

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

constructeur en PHP 5

n°1447042
rufo
Pas me confondre avec Lycos!
Posté le 25-09-2006 à 11:40:37  profilanswer
 

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:

mood
Publicité
Posté le 25-09-2006 à 11:40:37  profilanswer
 

n°1447045
chani_t
From Dune
Posté le 25-09-2006 à 11:45:50  profilanswer
 

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 ?

n°1447055
omega2
Posté le 25-09-2006 à 11:51:52  profilanswer
 

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.

n°1447074
gizmo
Posté le 25-09-2006 à 12:07:55  profilanswer
 

Ou bien tu fais simplement deux factory methods.

n°1447099
c0wb0y
:d
Posté le 25-09-2006 à 12:39:56  profilanswer
 

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.

n°1447104
rufo
Pas me confondre avec Lycos!
Posté le 25-09-2006 à 12:49:42  profilanswer
 

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).

n°1447106
rufo
Pas me confondre avec Lycos!
Posté le 25-09-2006 à 12:51:48  profilanswer
 

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?

n°1447107
gizmo
Posté le 25-09-2006 à 12:57:28  profilanswer
 

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.

n°1447120
rufo
Pas me confondre avec Lycos!
Posté le 25-09-2006 à 13:26:57  profilanswer
 

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:

n°1447233
nargy
Posté le 25-09-2006 à 17:21:15  profilanswer
 

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
mood
Publicité
Posté le 25-09-2006 à 17:21:15  profilanswer
 

n°1447403
rufo
Pas me confondre avec Lycos!
Posté le 26-09-2006 à 09:16:51  profilanswer
 

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
n°1447914
nargy
Posté le 26-09-2006 à 22:52:25  profilanswer
 

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.

n°1447968
gizmo
Posté le 27-09-2006 à 08:49:09  profilanswer
 

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

n°1448064
rufo
Pas me confondre avec Lycos!
Posté le 27-09-2006 à 11:19:00  profilanswer
 

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?  ;)  

n°1448531
nargy
Posté le 28-09-2006 à 00:23:50  profilanswer
 

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

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

  constructeur en PHP 5

 

Sujets relatifs
Php et CSVLancer un programme depuis une page en PHP
[PHP] adapter un script en une fonction[PHP] Afficher derniere ligne d'un fichier texte
Ecrire dans htaccess avec les fonctions PHP[PHP/Mysql] Pb avec mysql_fetch_row
panier virtuel PHP[PHP /Mysql] Internal Server Error dans les parties administration
J'aimerais modifier légérement cette fonction PHP, un peu d'aide svp[PHP] récupérer le code source
Plus de sujets relatifs à : constructeur en PHP 5


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