Liens entre les classes

Rechercher

Liens entre les classes

Par Palca  -  14 reponses  -  Le 17/01/2008 11:10  -  Editer  - 

Bonjour,

Je débute en POO principalement grâce à vos tutoriels fort instructifs, mais je voudrais savoir s'il est possible de "croiser" le fonctionnement de certaines classes. En l'occurrence j'ai commencé à créer des classes de gestion d'espace membre, j'ai actuellement une classe pour MySql et une autre pour la gestion des sessions. Celle-ci utilisant MySql, j'ai besoin d'utiliser ma classe MySql. De même ma classe MySql a recours à un fichier de configuration contenant les éléments de connexion à la base ainsi que les noms des différentes tables. Ma question est donc principalement de savoir comment gérer les inclusions de fichiers dans les classes, dois-je faire quelque chose du genre : monfichier.php : ou : monfichier.php : sessions.php : mysql.php : Sachant que de toute façon ma classe MySql me servira dans toute la page et pas seulement pour les sessions. De même par la suite j'aurai besoin d'une classe Login qui nécessitera MySql et Session et probablement d'autres croisements de ce type. Merci d'avance.

 

Réponses apportées à cette discussion

Par Palca  -  Le 17/01/2008 11:13  -  Haut de page  - 

Tout mon code et les espaces ont été supprimés et impossible d'éditer le message, post inutile donc...

 
Par Emacs  -  Le 17/01/2008 14:36  -  Haut de page  - 

Bonjour,

La première chose à faire est d'utiliser une classe par fichier. Par exemple :

  • MySQL.class.php
  • Configuration.class.php
  • Membre.class.php
  • ...

Ensuite tu peux utiliser les__autoload() pour charger dynamiquement les classes dont tu auras besoin dans tes classes.

++

PS : merci pour les remarques et quel navigateur utilises-tu ?

 
Par Palca  -  Le 17/01/2008 16:11  -  Haut de page  - 

J'utilise déjà un fichier par classe, mais ma question est surtout de savoir si dans un fichier quelconque j'inclus ma classe mysql puis ma classe sessions, est-ce que ma classe sessions pourra utiliser mes fonctions de mysql sans avoir à appeler à nouveau sa classe ?

Sachant que je pars du principe que je n'ai besoin que d'une instance de ma classe mysql, j'effectue la connexion dans le __construct(), donc si j'inclus ma classe mysql dans ma classe sessions la connexion se ferait en double (enfin si j'ai bien compris).

Pour le navigateur j'utilise Firefox mais avec le plug-in noscript, c'est ce qui a dû poser problème vu qu'il désactive l'ajax.

 
Par Emacs  -  Le 17/01/2008 19:09  -  Haut de page  - 

Je ne saisis pas bien ton problème mais je pense que tu fais bien ceci grosso modo dans ton code principal qui instancie tes classes ?

<?php
  require('/chemin/absolu/vers/MySQL.class.php');
  require('/chemin/absolu/vers/Session.class.php');
  require('/chemin/absolu/vers/Membre.class.php');
  $dbh = new MySQL('localhost','login','password');
  $dbh->setBase('maBase');
  $session = new Session();
  // ...
?>

Effectivement si tu désactives JS tu auras des problèmes pour rédiger des tutos ici. J'ai mis en place l'éditeur Wysiwig TinyMCE avec des restrictions. Je filtre toutes les données envoyées. JS ou pas JS d'activé.

++

Hugo.

 
Par Palca  -  Le 17/01/2008 19:43  -  Haut de page  - 

Oui exactement, mon problème est cependant que je n'arrive pas à utiliser ma classe mysql dans sessions.

En l'occurence j'ai testé $db->query(...); dans une de mes fonctions de la classe de sessions mais php me renvoit une erreur "Call to a member function query() on a non-object in (fichier)".

 
Par Emacs  -  Le 17/01/2008 22:06  -  Haut de page  - 

Normal il faut que tu transmettes ton instance $db à ton instance $session. Ce qui pourrait donner quelque chose comme ça :

<?php
  $db = new MySQL();
  $session = new Session();
  $session->setDatabaseObject($db);
?>

++

 
Par Palca  -  Le 17/01/2008 22:36  -  Haut de page  - 

Merci mais ça ne fonctionne pas, j'ai l'erreur suivante : Call to undefined method Session::setDatabaseObject()

Autrement si par exemple j'ai ce code :

class SuperClass
{
...
}
class MySql extends SuperClass
{
...
}
class Session extends SuperClass
{
...
}

Est-ce que je pourrais accéder à mes fonctions MySql dans ma Session ?

 
Par Emacs  -  Le 18/01/2008 00:09  -  Haut de page  - 

Merci mais ça ne fonctionne pas, j'ai l'erreur suivante : Call to undefined method Session::setDatabaseObject()

Normal il faut que tu crées cette méthode dans ta classe Session et que tu ajoutes aussi un attribut pour stocker dans l'objet Session l'instance de MySQL.

 
Par Palca  -  Le 18/01/2008 09:17  -  Haut de page  - 

C'est parfait, merci beaucoup !

Sinon comme je l'écrivais dans mon précédent message, est-ce possible de générer une classe incluant plusieurs autres classes et d'utiliser toutes leurs variables / fonctions avec $this-> ?

Par exemple je créé une fonction qui va m'inclus toutes les classes dont j'ai besoin, les "fusionne" en quelque sorte et après j'utilise toutes leurs fonctions sans me soucier de quelle classe elles viennent.

 
Par Emacs  -  Le 18/01/2008 10:10  -  Haut de page  - 

Salut Palca,

Je ne comprends pas trop bien ta question. As-tu regardé du côté de la méthode magique __autoload() qui te permet de charger dynamiquement des classes ?

 
Par Palca  -  Le 18/01/2008 13:50  -  Haut de page  - 

En fait je compte coder plusieurs classes qui auraient des sous-classes incluses suivant les fonctions à utiliser, de manière à éviter d'inclure du code qui serait inutile.

Par exemple je voudrais faire une hiérarchie comme celle-ci, sachant que dans cet exemple Caddie et Membre doivent hériter de Session, et que Membre inclut sa sous-classe suivant les fonctions nécessaires. Donc je suppose que je peux faire tout ça avec des "extends" d'une classe sur l'autre, mais j'ai également besoin dans mes classes Enregistre et Connecte d'une instance de Ajax, qui elle-même aura également besoin de MySql.

MySql

Session -> Caddie

-> Membre -> Enregistre

-> Connecte

-> Utilise

Ajax -> AjaxAffiche -> Formulaire

-> (autres)

-> AjaxTeste -> Formulaire

-> (autres)

Bref je suppose qu'entre des "extends" et des "__autoload()" c'est faisable, mais je crains que finalement ça me complique la vie d'être toujours à savoir à quelle superclasse appartient telle ou telle classe, alors que j'ai vu dans le code du forum Fire-Soft-Board des éléments du style :

Fsb::$frame = &$this;
Http::check_gzip();
Fsb::$session->start(...);
Fsb::$mods->
Fsb::$tpl->

Qui sont utilisés dans une même classe sans que leurs classes correspondates y soient incluses explicitement (enfin il me semble).

En bref c'est vraiment à ce genre de code que je veux pouvoir arriver pour créer des classes, utiliser des éléments de mes autres classes sans avoir à me demander comment je dois les inclure ou autre (même si c'est fait à un niveau supérieur, mais dans une classe qui serait dédiée à ça).

En tout cas merci pour les renseignements, c'est très utile :)

 
Par Palca  -  Le 21/01/2008 18:25  -  Haut de page  - 

J'ai finalement réussi à faire ce que je voulais :

class Site
{
    public static $db;
    public static $session;
    ...
}
class MySql extends Site
{
...
}
class Session extends Site
{
    ...
    Site::$db->query(...);
    ...
}
require("class_site.php");
require("class_mysql.php");
require("class_session.php");
Site::$db = new MySql();
Site::$session = new Session();
...

Ainsi, je peux utiliser n'importe quelle fonction d'une classe dans une autre classe sans me soucier de savoir comment l'importer ou quoi que ce soit, je ne m'en occupe qu'au moment des inclusions dans mon fichier principal :)

 
Par Emacs  -  Le 21/01/2008 18:33  -  Haut de page  - 

Wai mais ta modélisation n'a pas de sens... MySQL et Session ne sont pas des sortes de Site donc elles ne devraient pas dériver de Site.

 
Par Palca  -  Le 21/01/2008 21:16  -  Haut de page  - 

Quelle importance du moment que ça marche et que c'est beaucoup plus pratique ?

Je ne vois pas en quoi ça n'a pas de sens de considérer que ces classes dérivent d'une superclasse permettant de créer un site ?

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |