[POO]Dépendances croisées?

Dépendances croisées? [POO] - PHP - Programmation

Marsh Posté le 25-03-2005 à 21:37:33    

Bonjour tout le monde,
 
Donc j'ai un problème qui est probablement simple a résoudre mais je n'ai pas vraiment trouvé de solution s'y rapportant en farfouillant sur le forum/google bienque j'imagine qu'il soit assez fréquent.
 
2 classes : Une gère le coté lié à mysql des scripts (connection a la base, execution des requetes, netoyage des tables,...), l'autre gère les erreurs rencontrées dans les scripts (elle les inscrit dans des fichiers, les classe par ordre d'apparition et d'importance,...)
 
Le probleme est que les 2 classes sont liées l'une a l'autre dans le sens ou la classe mysql peut générer des erreurs et la classe des erreurs doit inserer des données dans les tables.
 
Je me trouve donc avec le constructeur d'une classe appellant celui de l'autre, et donc au lancement du script, le parseur fait un allé retour entre les scripts sans parvenir a en sortir.
 
Y a t-il une maniere de s'en sortir sans passer par l'heritage (qui me semble ici un "hack" étant donné que du point de vue logique, aucune des 2 n'herite rien de l'autre)? J'imagine que oui mais je n'arrive pas bien a voir comment ... surment à cause du fait que je ne suis pas encore tres familier avec l'OO en php
 
Merci d'avance et bonne soirée
 
Esox


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 25-03-2005 à 21:37:33   

Reply

Marsh Posté le 25-03-2005 à 21:46:27    

Citation :

Une gère le coté lié à mysql des scripts (connection a la base, execution des requetes, netoyage des tables,...)

ça ça ressemble de prêt à des méthodes qui devraient être statiques...ça existe pas en php ?

Reply

Marsh Posté le 26-03-2005 à 06:02:32    

Si, biensur que si ... Je m'y était pour le moment pas trop interessé en PHP ... Je vais creuser un peu ça ... merci pour la piste ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-03-2005 à 10:45:43    

Ce que tu peux faire c'est utilise un "setter".
 
Dans le genre :
 

Code :
  1. class BDD {
  2.   var $err;
  3.   function BDD() {
  4.     $this->err = null;
  5.   }
  6.   function setErr($err) {
  7.     $this->err = $err;
  8.   }
  9.  
  10.   function verifErr() {
  11.     if ($this->err==null) {
  12.        $err = new Erreur();
  13.        $err->setBdd($this);
  14.        $this->setBdd($err);
  15.     }
  16.   }
  17.   function exec($qry) {
  18.     $this->verifErr();
  19.     // ...
  20.   }
  21. }


Et tu fais la meme chose dans ta classe Erreur.
 
De cette facon, tu pourras reutilier tes classes, et si a un moment donne tu oublie de faire un setBdd ou setErr, alors le code de la fonction creera a ce moment la une nouvelle instance de la classe.

Reply

Marsh Posté le 27-03-2005 à 11:29:14    

Cerel merci, ca reviens un peu au meme qu'utiliser les interfaces php5 ton systeme non?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 27-03-2005 à 12:15:59    

Bon je suis pas encore passe a php5, mais etant donne que ce dernier ressemble beacoup a java, par extension je peux peut-etre deviner ce que tu appelle interface.
 
En java (et peut-etre en php5), une interface est simplement une definition des methodes que doit implementer un objet lorsqu'il implemente l'edite l'interface. S'il ne les implemente pas toutes, alors le compilo va le lui rappeller. Les interfaces servent surtout a s'assurer qu'une serie d'objets, qui n'ont rien en commun (comprendre qui n'ont pas d'ancetre commum), ont quand meme une serie de methodes en commum. Ainsi, meme si ces objets n'ont pas d'ancetre commum, on pourra quand meme les utiliser dans un algo ou autre.
 
 
Le systeme que je t'ai montre n'est pas vraiment une interface, mais je pense que tu pourrais en creer une pour les deux objets.

Reply

Marsh Posté le 28-03-2005 à 11:36:54    

Juste une question cerel,
 
pour le code que tu m'a posté avant, pourquoi ce n'est pas :
 

Code :
  1. $this->setErr($err);

 
à la ligne 16?
 
Merci :)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-03-2005 à 14:17:35    

C'est tres simple, c'est parce que ...
Euhh, comment t'expliquer cela en des termes simples ..
C'est a dire que ...
Tu vois ...
Hmmm...
 
[mode prof]
C'est une faute volontaire pour voir si tu suivais.
[/mode prof]
:D

Reply

Marsh Posté le 28-03-2005 à 15:33:08    

[mode eleve ON]
Ahh d'accord ... *chuchotte* Vieu con, quand on est trop stupide pour ecrire juste on prend sa retraite
[mode eleve OFF]
 
Lol oki pas de probleme ;) , c'est juste que je me demandais a quel moment j'ai planté dans mon apprentissage de php :p


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-04-2005 à 23:23:26    

esox_ch a écrit :

Bonjour tout le monde,
 
Donc j'ai un problème qui est probablement simple a résoudre mais je n'ai pas vraiment trouvé de solution s'y rapportant en farfouillant sur le forum/google bienque j'imagine qu'il soit assez fréquent.
 
2 classes : Une gère le coté lié à mysql des scripts (connection a la base, execution des requetes, netoyage des tables,...), l'autre gère les erreurs rencontrées dans les scripts (elle les inscrit dans des fichiers, les classe par ordre d'apparition et d'importance,...)
 
Le probleme est que les 2 classes sont liées l'une a l'autre dans le sens ou la classe mysql peut générer des erreurs et la classe des erreurs doit inserer des données dans les tables.
 
Je me trouve donc avec le constructeur d'une classe appellant celui de l'autre, et donc au lancement du script, le parseur fait un allé retour entre les scripts sans parvenir a en sortir.
 
Y a t-il une maniere de s'en sortir sans passer par l'heritage (qui me semble ici un "hack" étant donné que du point de vue logique, aucune des 2 n'herite rien de l'autre)? J'imagine que oui mais je n'arrive pas bien a voir comment ... surment à cause du fait que je ne suis pas encore tres familier avec l'OO en php
 
Merci d'avance et bonne soirée
 
Esox


Si tes classes sont liées, ça correspond à un héritage.
 
C des méthodes virtuelles dont tu parles là, mais c inexistant dans le php (y compris le 5 je crois bien) :sweat:  
 
 
C un problème de compréhension sur lequel je bute encore en php... (je suis encore jeune padawan avec 1 ptite année de pratique seulement :hello:). Dès qu'on utilise une bdd on y insère plein de données issues de "contextes" (d'objets) différents, et donc une bonne partie des objets de l'application aura besoin d'être implémentée avec du sql.
Par exemple, ici tu as créé spécialement une classe mysql qui va s'occuper de l'interface avec la bdd (avec des méthodes qui utilisent le sql pour insérer, updater, supprimer, etc..), et pourtant tu dois aussi implémenter des méthodes sql dans ta classe erreur :sweat: (et qui plus est ressemblent beaucoup à celles de ta classe mysql)
 
 
Bon g ptet rien compris en fait :??:  :whistle:  
 
le + simple ne serait-il pas de faire en sorte que ta class mysql insère les bonnes données aux bons endroits dans la bdd, y compris les instances de ta classe erreur ? et celle-là tu l'utilises juste pour conserver en mémoire (ram/cache) les erreurs de tes pages, c tout [:airforceone]  
 
ie. ta classe erreur reste hors de tout contexte lié à une bdd, c ta class mysql qui sert d'interface ici (avec le code php/sql qui va bien pour insérer des données issues d'instances de la classe erreur)
 
 
Ou alors, si tu as bien identifié les objets dont certaines données ont besoin d'être enregistrées, eh bien tu crées une classe pour chacun d'entre eux qui hérite d'une classe mère mysql, et tu redéfinies tes méthodes sql dans les classes filles


Message édité par lkolrn le 19-04-2005 à 14:46:48
Reply

Marsh Posté le 03-04-2005 à 23:23:26   

Reply

Marsh Posté le 04-04-2005 à 00:17:05    

Disons que c'est pas exactement ça ... Quand une erreur est generée dans mon code, une methode est lancée, cette methode s'occupe d'inserer   l'erreur dans une base de donnée, dans un fichier log et affiche un message "neutre" a l'utilisateur.
 
Le probleme etant que certaines actions de ma classe mysql peuvent echouer (une requete par exemple), il m'est donc imperatif de pouvoir recuperer l'erreur.
 
Pour le moment j'ai resolu le probleme en "patchan" un peu avec des appels statiques, mais je pense que dans un moment, quand j'aurai un peu plus de doighté avec l'OO en php je reviendrai sur ce script pour mettre un peu d'ordre :).
 
Par rapport a l'heritage, je considere que c'est un peu une bidouille.. parceque logiquement il n'y a aucune relation mere/fille entre les 2 classes (elles ne se rapportent pas du tout au meme "contexte" ), donc je prefere eviter cette methode, meme si elle peut totalement effacer le probleme parceque je la trouve non-correspondante logiquement a quelque chose de reel


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-04-2005 à 12:30:30    

c'est pas possible de faire comme en c++ ?
un truc du genre...

Code :
  1. class classA();  /* declaration d'une classe A */
  2. class classB{
  3.    var a;
  4.    classB(){ this->a = new classA(); }
  5. }
  6. class classA{
  7.    var b;
  8.    classA(){ this->b = new classB(); }
  9. }


Message édité par KangOl le 04-04-2005 à 12:31:28

---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 04-04-2005 à 12:54:21    

Heu ... pas que je sache ... en tout cas j'ai vu nulle part cette construction :s..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-04-2005 à 12:55:32    

j'ai pas tester faut dire (j'ai d'ailleurs pas php5 a ma disposition)


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 04-04-2005 à 12:56:24    

Moi je l'ai, je vais tester sur le champ mais j'y crois pas plus que ça  ...
 
[Edit] Je confirme, ca ne marche pas


Message édité par esox_ch le 04-04-2005 à 13:01:23

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-04-2005 à 13:11:37    

j'aurai au moins tenter :D


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 04-04-2005 à 13:16:10    

KangOl a écrit :

c'est pas possible de faire comme en c++ ?
un truc du genre...

Code :
  1. class classA();  /* declaration d'une classe A */
  2. class classB{
  3.    var a;
  4.    classB(){ this->a = new classA(); }
  5. }
  6. class classA{
  7.    var b;
  8.    classA(){ this->b = new classB(); }
  9. }



faut faire de l'héritage pour ça... [:airforceone] Là ça tourne en boucle...


Message édité par lkolrn le 04-04-2005 à 13:16:39
Reply

Marsh Posté le 04-04-2005 à 14:01:58    

Le truc c'est que faire de l'heritage la c'est une solution purement "pratique", dans le sens ou logiquement la classe mysql n'herite rien du tout de la classe erreur, ni inversement..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 04-04-2005 à 14:03:22    

esox_ch a écrit :

Le truc c'est que faire de l'heritage la c'est une solution purement "pratique", dans le sens ou logiquement la classe mysql n'herite rien du tout de la classe erreur, ni inversement..

+1

Reply

Marsh Posté le 05-04-2005 à 11:21:59    

Apres qulques heures de test j'en arrive a l'impression que PHP5 n'integre pas la composition :( Je me choppe a chaque fois une erreur :  
 
Fatal error: Cannot redeclare Maclasse::$monobjet :(
 
Deplus je ne peut pas utiliser les methodes statiques parceque ca signifierai que les variables seraient partagées par toutes les instances, ce que je dois eviter :( , je vais essayer d'implementer la methode de Cerel :)


Message édité par esox_ch le 05-04-2005 à 11:26:48

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

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