6.Le langage PHP
6.7.Include
6.7.4.Include et include_path
6.7.4.1.Introduction
On peut considérer qu'il existe 4 façons de préciser le chemin d'un fichier à inclure.
- En précisant un chemin relatif:
include('../fichier.php');
- En précisant un chemin absolu:
include('C:\www\fichier.php');
ou
include('/var/www/fichier.php');
- En précisant un chemin relatif converti en chemin absolu:
include(dirname(__FILE__).'/../fichier.php')
ou
include(__DIR__.'/../fichier.php')
depuis PHP 5.3.0
- En précisant un chemin à rechercher dans l'include_path:
include('mabliotheque/fichier.php');
|
6.7.4.2.Chemin relatif
On peut presque dire que l'utilisation du chemin relatif ne fonctionne pas. Le chemin relatif est déterminé à partir du script qui est exécuté (et non du script qui fait l'inclusion). Ainsi si un script
stats/stats.php fait l'inclusion d'un script
maths/maths.php via
include('../maths/maths.php')
si on lance l'exécution du script
stats.php il n'y aura pas de problème: le script
maths.php sera correctement intégré.
En revanche si un script
principal.php placé à la racine fait appel à
stats.php via l'instruction
include('stats/stats.php')
le fichier
stats.php sera correctement inclus mais pas
maths.php qui sera recherché dans le dossier
../maths relativement à
principal.php (et non à
stats.php)
6.7.4.3.Chemin absolu
La seconde solution (celle du chemin absolu) est également totalement déconseillée (en tout cas, sous cette forme ci). Ceci implique en effet que le script soit toujours à la même place quelque soit la machine sur laquelle il est copié et quelque soit le contexte (pas de versions différentes en fonction du projet). Si dans votre environnement, le fichier est sous
/var/www/ rien ne dit que dans l'environnement d'un autre serveur il n'est pas plutot sous
/usr/local/apache/htdocs/ ou même sous
C:\EasyPHP\www\. Une variante à cette solution consiste à déclarer une constante dans un fichier de configuration (qu'il faudra toutefois bien inclure)
define('DOSSIER_BIBLIOTHEQUE', '/var/www/');
et remplacer d'éventuels
include('/var/www/include/monfichier.php');
par
include(DOSSIER_BIBLIOTHEQUE.'monfichier.php');
|
- Dans l'exemple cité, il s'agit d'un cas particulier où la constante DOSSIER_BIBLIOTHEQUE pourrait être remplacée par la variable prédéfinie[c'est quoi?] $_SERVER['DOCUMENT_ROOT'].'/include' mais cela ne fonctionnerait pas si la bibliothèque devait être utilisée pour un script executé en ligne de commande
- Dans la mesure du possible il est recommandé de mettre les scripts des bibliothèques en dehors de www/
|
6.7.4.4.Chemin relatif converti en chemin absolu
Utiliser des chemins relatifs convertis en chemins absolus c'est une solution que je préconise pour les aspects de vos projets où l'arborescence de vos fichiers est clairement définie et n'est pas censée beaucoup évoluer dans le temps. Cette solution sera souvent utilisée dans les scripts d'exemple de ce site car elle vous permet de tester les scripts sans aucune configuration (il suffit juste de respecter la hierarchie des fichiers).
Pour convertir des chemins relatifs en chemins absolus c'est extrêmement simple, il suffit de déterminer le chemin absolu du script qui fait l'inclusion pour cela nous pouvons nous aider des constantes
__FILE__ qui donne le chemin complet du script (nom du fichier y compris) ou
__DIR__ qui donne le chemin complet du dossier qui contient le script (cette constante n'est disponible que depuis PHP 5.3.0). Pour extraire de
__FILE__ le nom du dossier, il suffit d'utiliser la fonction
dirname().
Ainsi
include('../fichier.php');
devra être remplacé par
include(dirname(__FILE__).'/../fichier.php')
ou
include(__DIR__.'/../fichier.php')
depuis PHP 5.3.0
6.7.4.5.Chemin à rechercher dans l'include_path
Enfin, la dernière solution consiste à simplement préciser le nom du fichier (et éventuellement ses dossiers parents) et "laisser" PHP rechercher dans un certain nombre d'endroits la présence (ou non) de ce script. Mais où va-t-il chercher ça? Réponse: Dans les dossiers déclarés dans un paramêtre de configuration appelé include_path.
include_path contient une liste de répertoires séparés par des points-virgules sous windows ou des deux-points sous linux. Ou d'une manière plus générale par le caractère défini dans la constante PATH_SEPARATOR
Ainsi si l'on fait un
include('mabibliotheque/fichier.php');
alors que
include_path contient la valeur .:/usr/share/php:/usr/share/pear. Alors l'interpreteur PHP cherchera d'abord la présence du fichier mabibliotheque/fichier.php depuis le dossier contenant le script actuellement exécuté (dossier '.') puis il va tester l'existence de /usr/share/php/mabibliotheque/fichier.php puis celle de /usr/share/pear/mabibliotheque/fichier.php. Et s'il ne trouve rien, une erreur sera levée.
Cette méthode est la seule valable pour inclure des bibliothèques de fonctions fournies par des personnes extèrieures à votre projet (PEAR
[c'est quoi?], Zend Framework, etc.) et c'est également celle préconisée pour intégrer vos propres bibliothèques dans vos projets
Encore faut-il que le paramètre de configuration include_path soit correctement défini. Or il existe différentes façons de faire comme nous allons le voir.