Bonjour,
Voici un sujet qui me donne pas mal de soucis quand je veux faire une application web.
Comment écrire ses chemins ?
Il y a plusieurs façons de procéder et je vais donner mon avis sur chacune d’elles.
Contexte
Il faut d’abord savoir dans quel contexte on est. Le contexte dans ce cas est l’environnement qui va résoudre le chemin.
On peut distinguer 3 contextes différents :
Le contexte php : C’est PHP sur le serveur qui va résoudre le chemin et consommer le fichier.
Le contexte http de la page : C’est le navigateur qui va demander le fichier et il connaît l’url en cours.
Le contexte externe : On ne connaît rien sur l’adresse du fichier à atteindre. Quand on est dans un mail par exemple.
Invocation
Dans le contexte de PHP
On peut invoquer un fichier de plusieurs façons :
! J’ai choisis la commande include, mais toutes les autres invocations marchent de la même façon pour les autres types d’inclusion
Chemin aléatoire
include "../chemin/fichier.php";
C’est une inclusion relative au chemin courant.
Cette méthode marche mais on ne sais pas toujours quel fichier est utilisé à cause de sa méthode de résolution cf doc.
On se met à dupliquer les fichiers pour être sûr de l’inclure sans se prendre la tête à comprendre la résolution de PHP.
Chemin relatif
include __DIR__."/../chemin/fichier.php";
On donne ici le chemin absolu dans l’arborescence du serveur, mais dans notre tête, c’est un chemin relatif au fichier courant.
C’est la méthode que je privilégie car il devient simple de retrouver son chemin 🙂
Chemin absolu
define("_ROOT", __DIR__."/../cheminVersRoot");
include _ROOT."/cheminDepuisRoot/fichier.php";
! Les 2 lignes ci-dessus sont dans 2 fichiers différents, généralement config.php pour la 1ère.
Ici aussi on donne un chemin absolu sur le serveur à PHP, mais dans notre tête, on donne un chemin absolu depuis la racine du projet.
C’est une solution qui fonctionne bien et qui avait son avantage à l’époque où on avait l’url qui reflétait la structure des fichiers.
Dans le contexte HTTP de la page
Pour illustrer ce contexte, j’utiliserais une balise img (et sans les attributs obligatoires).
Chemin relatif
<img src="../chemin/fichier.png">
C’est un chemin relatif, ça marchait à l’époque où le fichier php avait le même chemin que l’url pour y accéder. Depuis la réécriture d’url, c’est une technique qui ne fonctionnera pas sans y laisser ses cheveux.
Chemin absolu
<img src="/chemin/fichier.png">
C’est la méthode que j’utilise, elle a l’avantage de donner un chemin absolu par rapport à la racine du projet.
Chemin externe
<img src="http://www.domaine.com/chemin/fichier.png">
Le travail et la maintenance deviennent un vrai casse tête, il faut être certain d’avoir modifié les chemins du serveur local avant l’envoi etc.
Chemin externe aidé par PHP
define("_HTTP_ROOT", "http://www.domaine.com");
ou (pire) define("_HTTP_ROOT", $_SERVER["HTTP_HOST"]);
<img src="<?= _HTTP_ROOT ?>/chemin/fichier.png">
! Les 2 lignes ci-dessus sont censées être dans 2 fichiers différents
! J’ai choisi HTTP_HOST mais SERVER_NAME marche tout aussi bien, mais il faut faire attention avec ces variables
On essaie de pallier au problème ci-dessus en n’ayant qu’une constante à modifier, mais il faut quand même penser à la modifier avant l’envoi.
Dans le contexte externe
La meilleure solution est le chemin externe décrit ci-dessus.
On peut néanmoins avec quelques précautions utiliser les variables dans $_SERVER.
Conclusion
Les chemins sont toujours un casse tête en PHP. Avec un peu de rigueur et en utilisant la bonne forme, on peut s’en sortir.
Je n’ai pas mis tous les dérivés de chemins que j’ai pu utiliser mais seulement un échantillon. Si vous avez une suggestion intéressante que j’aurais oublié n’hésitez pas à la mettre en commentaire.