Hier je parlais des ArrayObject, sorte de fourre-tout sans nom et sans type. Un exemple de son utilisation est le passage de paramètres aux méthodes qui servent à faire des requêtes sur la base de données. On les traites à coup de tests pour savoir si une propriété des paramètres est vide, est un tableau, et un tableau d'entier, etc... Je me suis dis, tiens bonne occasion de passer par une mini class qui permette de faire ça.
On crée une instance d'un class Param, on lui balance tous les paramètres qu'on veut, et ensuite la class qui gère les requêtes sur la base transforme Param à sa guise pour avoir en retour toujours le bon type de paramètres. Bon. Ca fonctionne. Mais ça utilise une class générique (Param), une classe par type de requête (LogParam, NoticeParam, UserParam, etc...) ce n'est pas plus court, ce n'est pas plus lisible (enfin si mais c'est plus long). Bref, je ne sais pas si je garde ça…
Tiens, au passage, j'ai essayé de me passer de ce Param et d'utilisé uniquement les sqlStatement déjà présent dans quelques class et qui devront à terme être présent partout. Ben ce n'est pas possible car il est quasi impossible de savoir ce qu'on a déjà mis dedans (on a parfois besoin de modifier un paramètre déjà existant ou de le tester pour ajouter une autre options) et on ne peut pas nom plus passer un SelectStatement a deux requêtes consécutives (ou alors peut-être avec un clone mais ça va devenir compliqué) car si on ajoute par exemple un ->from() dans le première requête, il se retrouve dans la seconde alors qu'on l'y ajoute aussi (cette deuxième requête pouvant être faite sans la première)
Bref, j'ai mal à la tête et je n'arrive pas encore à la bonne solution.
1 De Franck -
À propos de
sqlStatement
, la méthodefrom()
a un paramètre qui permet de faire un reset de l'existant avant d'enregistrer le nouveau ; ça peut peut-être aider ?2 De Jean-Christian Paul Denis -
J'avais vu ça, c'est utilisé dans le code existant de Dotclear. Mais ici ce n'est pas le fait de faire un reset sur une valeur qui me pose problème, c'est plus de savoir si cette valeur existe, les sqlStatement ne le permettent pas et il n'y a pas moyen de faire ça simplement dedans.
Et je me suis habitué à la class Param, c'est loin d'être ce que je voulais mais pour l'instant ça me va ainsi.