include dirname(__FILE__).'/../../index.php';
est votre meilleur pari ici, et cela évitera la plupart des bogues de chemin relatifs que vous pouvez rencontrer avec d'autres solutions.
En effet, cela forcera l'inclusion à toujours être relative à la position du script courant où ce code est placé (quel emplacement est probablement stable, puisque vous définissez l'architecture de votre application). Ceci est différent de simplement faire include '../../index.php'
qui inclura relativement au script en cours d'exécution (également appelé "appel") et ensuite relativement au répertoire de travail actuel , qui pointera vers le script parent qui inclut votre script, au lieu de résoudre à partir du chemin de votre script inclus .
Depuis la documentation PHP:
Les fichiers sont inclus en fonction du chemin d'accès au fichier donné ou, si aucun n'est indiqué, du chemin d'inclusion spécifié. Si le fichier n'est pas trouvé dans include_path, include va finalement archiver le propre répertoire du script appelant et le répertoire de travail actuel avant d'échouer.
Et le message le plus ancien que j'ai trouvé citant cette astuce remonte à 2003, par Tapken .
Vous pouvez tester avec la configuration suivante:
Créez une mise en page comme celle-ci:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
Dans parent.php
, mettez:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
Dans sub/included.php
, mettez:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Résultat lors de l'accès parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Comme nous pouvons le voir, dans le premier cas, le chemin est résolu à partir du script appelant parent.php
, tandis qu'en utilisant l' dirname(__FILE__).'/path'
astuce, l'inclusion est effectuée à partir du script dans included.php
lequel le code est placé.
Attention, ce qui suit PAS équivalent à l'astuce ci-dessus contrairement à ce que l'on peut lire ailleurs:
include '/../../index.php';
En effet, le préfixe /
fonctionnera, mais il se résoudra comme à include ../../index.php
partir du script appelant (la différence est que include_path
cela ne sera pas examiné par la suite en cas d'échec). Depuis la documentation PHP :
Si un chemin est défini - qu'il soit absolu (commençant par une lettre de lecteur ou \ sous Windows, ou / sur les systèmes Unix / Linux) ou relatif au répertoire courant (commençant par. Ou ..) - le include_path sera complètement ignoré.