include dirname(__FILE__).'/../../index.php';
est la meilleure solution, car elle permet d'éviter la plupart des problèmes de chemins relatifs que vous pouvez rencontrer avec d'autres solutions.
En effet, cela obligera l'inclusion à toujours être relatif à la position du script actuel où est placé ce code (dont l'emplacement est très probablement stable, puisque vous définissez l'architecture de votre application). C'est différent de simplement faire include '../../index.php'
qui inclura relativement au script en cours d'exécution (aussi appelé "appelant") script et ensuite relativement au répertoire de travail actuel qui pointera vers le script parent qui inclut votre script, au lieu de se résoudre à partir du chemin de votre script inclus.
Extrait de la documentation PHP :
Les fichiers sont inclus en fonction du chemin d'accès au fichier donné ou, si aucun n'est donné, le include_path spécifié. Si le fichier n'est pas trouvé dans le include_path, include vérifiera finalement dans le propre répertoire du script appelant et le répertoire de travail actuel avant d'échouer.
Et le plus ancien post 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
Sur parent.php
, mis :
<?php
include dirname(__FILE__).'/sub/included.php';
?>
Sur sub/included.php
, mis :
<?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 on peut le voir, dans le premier cas, le chemin est résolu à partir du script appelant. parent.php
tandis qu'en utilisant le dirname(__FILE__).'/path'
l'inclusion se fait à partir du script. included.php
où le code est placé.
Attention, ce qui suit N'EST PAS équivalent à l'astuce ci-dessus contrairement à ce que l'on peut lire ailleurs :
include '/../../index.php';
En effet, en ajoutant /
fonctionnera, mais il sera résolu comme include ../../index.php
de l'appelant script (la différence est que include_path
ne sera pas regardée après coup si elle échoue). Extrait de la documentation PHP :
Si un chemin est défini - qu'il soit absolu (commençant par une lettre de lecteur ou \ sous Windows, ou / sous les systèmes Unix/Linux) ou relatif au répertoire répertoire actuel (commençant par . ou ..) - le chemin d'accès include_path sera totalement complètement ignoré.