Parlons includes. En général, lorsqu’on réalise un projet en PHP, on découpe le travail en plusieurs parties qui se répartissent donc logiquement en plusieurs fichiers. Pourquoi ? Parce que c’est en général plus simple de savoir où on est quand on manipule un fichier dont le nombre de lignes se rapproche plus de la centaine que du millier.
Cependant, gérer plusieurs fichiers est parfois délicat : on se retrouve confronté à des problèmes de répertoire, de path relatif difficile à prévoir et toutes ces subtilités. Et comme on décide de l’architecture d’un projet avant même de commencer le gros du code, on a vite fait de tout foutre en l’air à cause d’une mauvaise organisation. Evidemment, on ne peut jamais prévoir totalement les problèmes que causeront notre architecture choisie. Donc, au lieu de prévoir tous les problèmes possibles qui pourraient arriver, il est bien plus pratique de prévoir un système de base d’includes qui est flexible, c’est à dire que les modifications seront simples à effectuer. Changer 50 fichiers car on a besoin d’en renommer un autre est un gros problème de flexibilité par exemple. Il y a donc une bonne et une mauvaise façon de gérer ses includes.
The Bad Way
Cette méthode est malheureusement retrouvée parmi les débutants, car on la retrouve dans beaucoup de cours. C’est une mauvaise habitude pour des projets conséquents. Voyons pourquoi.
Imaginons cette architecture simple, retrouvée dans un paquet de projets (les noms sont fictifs) :
/lib ----/myFunctions.php ----/BDD.php ----/template.php ----/otherStuff.php /requireMe.php /index.php /pageUn.php /pageDeux.php /pageTrois.php /.htaccess
Dans cette organisation, on accède aux pages directement via leur URL (/index.php) ou via un URL Rewriting qui effectue une redirection silencieuse en arrière plan (c’est équivalent à la première méthode). Chaque page inclut le fichier requireMe.php, qui inclut les fichiers annexes contenus dans /lib. Donc, chaque page accède bien au code qui est commun.
Cette méthode est très rapide à mettre en oeuvre et très simple : elle est bien adaptée à l’Extreme Programming mais malheuresement elle n’est pas vraiment flexible. En effet, pour l’instant c’est simple, mais imaginez que vous ayez 50 pages à la racine. Si, un jour, vous avez besoin de changer quelque chose qui a un rapport avec requireMe.php (comme son nom, son emplacement, …), vous devrez modifier 50 fichiers. Amusez-vous bien à perdre du temps.
The Good Way
Maintenant, on passe à une méthode que je qualifie de “bonne”, enfin c’est mon avis subjectif. Il est quand même certain qu’elle est plus flexible que la mauvaise méthode.
On a une architecture de ce type :
/lib ----/myFunctions.php ----/BDD.php ----/template.php ----/otherStuff.php /pages ------/index.php ------/pageUn.php ------/pageDeux.php ------/pageTrois.php /main.php /.htaccess
On accède aux pages via URL Rewriting uniquement. Cela permet de placer les pages dans un dossier spécial. Ce qui est important ici, c’est qu’on redirige TOUTES les requêtes au script main.php. Cela permet de n’avoir qu’une ligne dans le .htaccess, peu importe le nombre de pages. Et ça, c’est flexible.
Mais qu’est-ce qui change ? Tout le système est inversé, en fait. Le fichier main.php va analyser $_SERVER['REQUEST_URI'], inclure la bonne page (ou générer une erreur du type 404 ou autre), éventuellement utiliser des regex sur cette variable pour les URI du type /Article-27/1991/Janvier/27/ et inclure en plus des fichiers annexes contenus dans /lib. On ne retrouve donc aucun include dans les fichiers des pages : tout est regroupé dans le fichier main.php ; grâce à quelques constantes bien choisies, on peut s’adapter à, à peu près n’importe quoi en changeant un minimum de choses. Le système est inversé car ce n’est plus la page qui inclut les fichiers annexes, c’est un fichier annexe qui inclut la bonne page. Il n’y a dont plus qu’un seul fichier qui gère les inclusions : système souple.
Alors certes, je n’ai rien trouvé de révolutionnaire. Mais en général, quand on se rend compte que l’architecture est à chier, c’est trop tard. Il faut faire quelques bons choix dès le tout début. En résumé : n’incluez pas les fichiers annexes dans vos pages, incluez la page dans un fichier annexe spécial !