Liens entre les classes
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
Tout mon code et les espaces ont été supprimés et impossible d'éditer le message, post inutile donc...
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 ?
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.
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.
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)".
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);
?>
++
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 ?
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.
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.
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 ?
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 :)
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 :)
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.
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 ?