variables membres sont des objets -> bonne/mauvaise idée ?

variables membres sont des objets -> bonne/mauvaise idée ? - PHP - Programmation

Marsh Posté le 19-04-2006 à 12:21:15    

Bonjour,
 
J'ai un problème pour concevoir mes objets. J'utilise pas mal de variable membre qui sont en fait des objets. Cela me permet assez facilement d'accéder à mes objets, par l'intermédiaire de l'objet dont il dépend.
 
Je m'explique, j'ai 2 objets, un objet client et un objet commande. Dans mon objet commande, j'ai une variable membre 'monClient', qui est un objet client. Lors d'un commande j'accède à mes données client comme suit :

Code :
  1. $obj_commande->monClient->getVille();


 
Mais je ne sais pas s'il s'agit d'une bonne ou d'une mauvaise façon de voir les choses.
 
D'un coté je voudrais essayer de faire une hiérarchie d'objets cohérente et d'un autre je ne voudrais pas me retrouver coincé si mes objets sont trop lourds à utiliser.
 
Merci de vos réponses

Reply

Marsh Posté le 19-04-2006 à 12:21:15   

Reply

Marsh Posté le 19-04-2006 à 12:42:10    

J'ai oublié de dire que je ne fais pas de modélisation uml, mais merise. Mon problème vient peut être de là ?

Reply

Marsh Posté le 19-04-2006 à 13:36:15    

ça marche très bien...quel est le soucis? :??:
Si tu veux éviter que ce soit trop lourd évite les recopies, par contre, pour les objets...passe-les par référence :
Si tu les passes en paramètre de fonctions n'oublie pas le &, et idem lors des affectations.


Message édité par skeye le 19-04-2006 à 13:36:45

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

Marsh Posté le 19-04-2006 à 13:50:44    

Bien sur que ça marche, mais je voulais seulement avoir confirmation que c'était la bonne façon de voir les choses.

Citation :


Si tu veux éviter que ce soit trop lourd évite les recopies, par contre, pour les objets...passe-les par référence :  
Si tu les passes en paramètre de fonctions n'oublie pas le &, et idem lors des affectations.


Peux tu être un peu plus précis pour les affectations (exemple)
 
Merci

Reply

Marsh Posté le 19-04-2006 à 13:53:07    

bah au lieu de faire

Code :
  1. $truc = $monjoliobjet;


 
tu fais
 

Code :
  1. $truc =& $monjoliobjet;


 
Par contre si tu touches à $truc tu modifies aussi $monjoliobjet dans ce cas, donc attention à voir si c'est bien adapté à ton utilisation.

Message cité 1 fois
Message édité par skeye le 19-04-2006 à 13:53:33

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

Marsh Posté le 19-04-2006 à 14:19:11    

précisons que c'est pour PHP4, en PHP5 les variables sont passées en référence par défaut, donc pas besoin de mettre &

Reply

Marsh Posté le 19-04-2006 à 14:20:15    

Djebel1 a écrit :

précisons que c'est pour PHP4, en PHP5 les variables sont passées en référence par défaut, donc pas besoin de mettre &


Ah tiens, j'apprends un truc...[:petrus75]
...et ya moyen de faire l'inverse, alors, en php5? [:autobot]


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

Marsh Posté le 19-04-2006 à 14:22:04    

euh ouais mais me demande pas comment :D

Reply

Marsh Posté le 19-04-2006 à 14:22:39    

c'est ballot, de pas pouvoir faire une copie d'objet, quand même...[:jean-guitou]


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

Marsh Posté le 19-04-2006 à 14:23:57    

sisi tu peux, mais jsais plus comment ^^

Reply

Marsh Posté le 19-04-2006 à 14:23:57   

Reply

Marsh Posté le 19-04-2006 à 14:26:51    

jviens de retrouver, faut utiliser la méthode __clone()

Reply

Marsh Posté le 19-04-2006 à 14:30:12    

'tain c'est pratique.[:pingouino]


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

Marsh Posté le 19-04-2006 à 14:45:59    

bah personnellement je trouve ça carrément pratique de pas devoir mettre des & partout ^^

Reply

Marsh Posté le 19-04-2006 à 14:57:22    

oué m'enfin bonjour la compatibilité des anciens scripts, quoi...[:moule_bite]


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

Marsh Posté le 19-04-2006 à 15:20:45    

oui me demande aussi comment ça peut tourner, je pense que les scripts PHP4 qui tournent sur PHP5 sont pas faits en objet :p

Message cité 1 fois
Message édité par Djebel1 le 19-04-2006 à 15:22:18
Reply

Marsh Posté le 19-04-2006 à 15:28:04    

Djebel1 a écrit :

oui me demande aussi comment ça peut tourner, je pense que les scripts PHP4 qui tournent sur PHP5 sont pas faits en objet :p


euh, si, une partie des miens, par exemple.[:moule_bite]
'fin bref, heureusement qu'il y a pas d'effets de bord à la con comme ça, j'aurais été bien emmerdé de débugger ça...[:moule_bite]


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

Marsh Posté le 24-04-2006 à 12:41:04    

skeye a écrit :

bah au lieu de faire

Code :
  1. $truc = $monjoliobjet;


 
tu fais
 

Code :
  1. $truc =& $monjoliobjet;


 
Par contre si tu touches à $truc tu modifies aussi $monjoliobjet dans ce cas, donc attention à voir si c'est bien adapté à ton utilisation.


 
Donc en fait il serait plus judicieux de faire des instanciations à l'extérieur des objets et de leurs passer ensuite le référence de l'objet à utiliser. (Exemple : Créer un objet client à l'extérieur de la classe commande, puis passer la référence de l'objet client à la classe commande).  
 
Cependant on est obligé d'instancier à chaque fois le client et la commande. Alors que ma methode consistait à instancier mon client dans le constructeur de ma commande. Comme ça je n'ai que la commande à instancier, le client s'instancie automatiquement.
 
Mais peut être cette dernière méthode allourdit-elle l'objet commande inutilement.
 
Laquelle des deux methodes est selon vous la plus optimisée.
 
Merci

Reply

Marsh Posté le 24-04-2006 à 12:45:45    

Effectivement, si l'objet "client" n'a pas d'existence propre avant la création de l'objet "commande" qui le contient, je ne vois pas d'intérêt à l'instancier en-dehors pour le passer ensuite en référence. :jap:


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