Il y’a quelques semaines, j’ai commencé à m’intéresser au fonctionnement d’ActiveRecord, loué par tous les utilisateur de RubyOnRails. Comme je n’ai pas encore eu le temps de plonger dans ce framework super tendance, je me suis dit que si c’était si bien, pourquoi ne pas voir la même chose en PHP que je connais déjà ?
Mon premier réflexe a d’abord été de chercher si personne n’avait pas déjà fait ça et je suis tombé sur le travail de Leendert Brouwer. C’est intéressant de voir comment ça fonctionne mais la classe est limitée à MySQL. Dommage, surtout que PHP5 intègre le support de SQLite par défaut. Je me dis alors qu’il faudrait y remédier. Simple, il suffit de se retrousser les manches et coder.
Et bien j’ai déjà pas mal avancé et remanié le code pour obtenir qui me convient à peu près. Le code reste cependant loin de la qualité qu’on peut attendre d’une bibliothèque utilisable en production (tests, documentation, etc.). Ceux que ça intéresse tout de même, je les invite à jeter un oeil aux codes sources et commenter.
8 replies on “Accéder à une base de données à la façon d’ActiveRecord avec PHP ?”
Pour moi, le principal intérêt de l’ActiveRecord de RoR c’est la reflexion qu’il effectue sur la base afin de déterminer les champs de l’objet qu’il représente ça évite bien des modifications lors de changements de la base de données. Evidemment, le revers de la médaille c’est les requètes supplémentaires engendrées, mais elles sont négligeables comparées à n’importe quelle insertion, mise à jour ou selection (d’un nombre quelconque de résultats).
Pour les classes existantes en php, il existe dans Pear une classe qui combine DB et Metabase : pear.php.net/package/MDB2…
De plus parmis les nombreux frameworks qui essayent de porter RoR en PHP, il doit bien être possible de n’utiliser que les classes qui reproduise ActiveRecord : phpontrax.com/, cakephp.org/, biscuitproject.tigris.org… http://www.symfony-project.com/ …
Pour ce qui est de RoR, j’avoue avoir été bluffé par la rapidité d’apprentissage. Et quand on y a gouté, c’est vrai que ça devient une corvée de devoir utiliser autre chose.
Le problème c’est que justement la réflexion faite dans ActiveRecord n’est pas portable dans PHP.
Ruby va chercher les descriptions des tables à la première requête et s’en "rappelle" aux requêtes suivantes. C’est pour ça que le coté "dynamique" de ActiveRecord ne coûte pas grand chose en performances.
PHP au contraire isole chaque requête et on ne peut pas laisser de variables ou données en mémoire. Du coup on redemanderait la description de toutes les tables à chaque fois et là l’impact sur les perf serait important.
Pour contrecarrer le problème on a deux solutions : soit on définit tout manuellement dans les sources (liste et type des champs) – et du coup on perd tout l’avantage -, soit on laisse PHP faire un cache sous forme de fichier – mais on perd un peu de souplesse.
Ceci dit, franchement, ActiveRecord et RoR sont superbes surtout grace à la métaprogrammation. Et là dessus PHP ne peut même pas concourrir. Bref, n’en attendez pas trop.
Ganf: pas moyen d’utiliser shmop ?
désolé pour le bruit, mais maurice: ton serveur n’a pas l’air de savoir servir les .phps 🙁
geoffrey: oui je suis au courant, j’ai bien essayé d’ajouter le type application/x-httpd-php-source mais c’est sans succès.
Maurice, tu veux dire :
"AddType application/x-httpd-php-source .phps" ?
bizarre… Tu fais comment ? ".htaccess" ou dans la configuration d’Apache ?
Dans tout les cas essaies cette directive : ForceType application/x-httpd-phps dans un fichier ".htaccess"
Sinon je rejoins les dires d’Eric, mais cela reste une bonne initiative tout de même ! Ceci étant dit RoR est en vogue actuellement, je ne pense pas qu’il faut mettre en concurrence les langages de programmation, car chacuns a ses avantages mais aussi ses inconvénients. Alors pourquoi pas Smalltalk aussi ?
Merci beaucoup pour cette source, tu me sauves grandement la vie!
si j’osais, je vous dirais bien d’aller faire un tour sur globulo.us où on a développé, avec deux amis, un ActiveRecord en PHP 5 qu’on pense être pas trop mal.
C’est qu’une alpha pour l’instant mais il nous facilite déjà bien la vie. La doc et plus généralement le site est en cours d’écriture mais on a essayé de bien commenter les sources, tant qu’à faire.
Si ca peut vous inspirer pour la suite, y’a une nightly à disposition 😉