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

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1689195
Kortex@HFR
Qu'ils sont cons ces lamas !!!
Posté le 20-02-2008 à 11:25:52  profilanswer
 

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
mood
Publicité
Posté le 20-02-2008 à 11:25:52  profilanswer
 

n°1689198
fred777888​999
Posté le 20-02-2008 à 11:30:44  profilanswer
 

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.

n°1689205
Kortex@HFR
Qu'ils sont cons ces lamas !!!
Posté le 20-02-2008 à 11:34:25  profilanswer
 

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
n°1689206
skeye
Posté le 20-02-2008 à 11:34:44  profilanswer
 

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 -
n°1689393
Kortex@HFR
Qu'ils sont cons ces lamas !!!
Posté le 20-02-2008 à 15:20:36  profilanswer
 

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
n°1689398
skeye
Posté le 20-02-2008 à 15:32:22  profilanswer
 

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 -
n°1689402
flo850
moi je
Posté le 20-02-2008 à 15:36:48  profilanswer
 

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

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

n°1689417
skeye
Posté le 20-02-2008 à 15:50:37  profilanswer
 

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 -
n°1689432
soulmanto
Chat Noir replica
Posté le 20-02-2008 à 15:58:10  profilanswer
 

et un array en paramètre?

Message cité 2 fois
Message édité par soulmanto le 20-02-2008 à 15:58:23
n°1689436
skeye
Posté le 20-02-2008 à 16:00:25  profilanswer
 

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 -
mood
Publicité
Posté le 20-02-2008 à 16:00:25  profilanswer
 

n°1689452
Kortex@HFR
Qu'ils sont cons ces lamas !!!
Posté le 20-02-2008 à 16:35:39  profilanswer
 

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
n°1689461
Xav_
The only one...
Posté le 20-02-2008 à 16:46:31  profilanswer
 

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
n°1689925
soulmanto
Chat Noir replica
Posté le 21-02-2008 à 10:20:22  profilanswer
 

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

n°1689961
skeye
Posté le 21-02-2008 à 10:53:46  profilanswer
 

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 -

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

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

 

Sujets relatifs
est-il possible de faire un appel dynamique à une procédure??indentation d'un flux XML - script PHP ?
Upload PHP ok mais fichier déplacé = 0 octetsProblème code erreur PHP
Problème PHP/MySQLdevellopeur PHP
reload d'une frame a partir d'une autre. PHP/javascript[?PHP,HTML,JAVA?] problème avec une redirection
[Conseil] PHP & classe Formulaires [résolu] 
Plus de sujets relatifs à : [PHP] La redéfinition est-elle possible ou pas ?


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