Bonjour à tous !
Avant de débuter, désolé pour le titre, je suis demeuré 2 minutes le curseur dans la case et j'ai pas trouvé plus explicite.
Bon, ce qui m'amène à vous.
Le contexte:
J'ai un site, qui est un jeu, avec des centaines d'actions possibles. Chaque action est en fait une simple classe, avec une méthode statique qui reçoit les objets requis en référence.
Exemple:
Jusque là, "ca va" (enfin, à mes yeux ca va)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Member_Action_Perso_Soigner { public static function generatePage(&$tpl, &$db, &$session, &$account, &$perso) {
Là ou ca se corse, c'est au sujet de $db:
$db est en fait une Classe qui s'occupe de gérer les rapports d'erreurs et les diverses statistiques, sans trop me compliquer l'utilisation normale le mysql:
Cette syntaxe est simple à utilisée, et si jamais une requête plante, ma classe s'occupe de m'envoyer un email toute seule (par exemple).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $result = $db->query('SELECT......');
Bref, elle m'est très pratique. Et je vous l'explique pour ne pas que vous me disiez qu'elle est inutile
Le souci:
Mon action soigner interagi avec des $perso, qui représente un personnage: Dans ce cas-ci, nous avons $perso (Le joueur), et le soigné, qui est instancié dans la méthode statique, afin de lui prodiguer les soins.
Si je veux changer les points de vie du personnage, j'ai un code qui ressemble à ceci:
Et c'est là que je trouve mes classes "intanciables" (Perso, Lieu, Item, etc.) peu intuitive d'utilisation: Parfois il faut passer &db, parfois non. Ce n'est pas toujours aussi évident que dans cet exemple. J'aimerais retirer complètement la nécessité de passer $db à ces méthodes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $victime->setPV($db, 34); $perso->gainXP($db, 'soin', 3);
Contraintes:
#1: J'ai besoin d'accéder à 2 bases de données : pas de singleton (à priori).
#2: J'aimerais utiliser une bonne pratique, et pas une solution tordue.
#3: Je pense éventuellement à implémenter PDO. La solution ne devra pas poser de problème d'évolution à ce niveau.
Mes solutions:
#1:
Passer par référence $db au constructeur de chaque objet qui pourrait en avoir besoin. Les objet stockeraient $db. (toujours par référence). Les méthodes pourrait donc faire $this->db->query(....);
Avantage: Je n'ai plus à passer $db dans les paramètres de mes méthodes d'objet
Désavantage: Je dois encore passer $db à mes actions (statique), car parfois l'action instancie de nouveau personnages, ou des objets d'usage système.
#2:
global $db;
Avantage: Cool, il est partout
Désavantage: Contrainte #2: Il me semble que ce n'est pas une bonne pratique.
#3:
Créer une classe singleton qui gère des instances de $db.
Son usage ressemblerait à:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //Dans ma page index.php: $dbs = new DbSingleton(); $dbs->newDb('connexion1', HOST, BASE, USER, PASS); //Créer une classe $db, contenu dans un array du singleton ( $this->arrDb['connexion1'] = new MySQLdb(...); ) //Dans une méthode quelconque: $dbs = new DbSingleton(); //Retourne l'instance du singleton existant $db = $dbs->getConnexion('connexion1'); //Retourne l'objet $db par référence $db->query(...);
Avantage: Cool, il est partout (enfin je crois, j'ai pas souvent utilisé de singleton)
Désavantage: Contrainte #2: Ca me semble tordu.
Bon, je doute d'avoir réussit à être clair, alors si vous avez des questions, n'hésitez pas. Et je sais que je ne dois pas être le premier à avoir fait face à ce problème, peut-être pourrez-vous m'éclairer sur la meilleure approche ?
Partager