include dirname(__FILE__).'/../../index.php';
это ваш лучший выбор, и он позволит избежать большинства ошибок относительного пути, с которыми вы можете столкнуться с другими решениями.
В самом деле, это заставит включение всегда относиться к положению текущего скрипта, в котором размещен этот код (это положение, скорее всего, стабильно, поскольку вы определяете архитектуру своего приложения). Это отличается от простого выполнения, include '../../index.php' которое будет включать относительно выполняемого (также называемого «вызывающим») скрипта, а затем относительно текущего рабочего каталога. , который будет указывать на родительский скрипт, который включает ваш скрипт, вместо разрешения из вашего пути включенного скрипта .
Из документации PHP:
Файлы включаются на основе указанного пути к файлу или, если он не указан, указанного include_path. Если файл не найден в include_path, include, наконец, проверит собственный каталог вызывающего сценария и текущий рабочий каталог перед ошибкой.
И самый старый пост, который я нашел, цитируя этот трюк, датируется 2003 годом, авторством Tapken .
Вы можете протестировать со следующей настройкой:
Создайте такой макет:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
В parent.php, говоря:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
В sub/included.php, говоря:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Результат при доступе parent.php:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Как мы видим, в первом случае путь разрешается из вызывающего скрипта parent.php , в то время как с помощью этой dirname(__FILE__).'/path'уловки включение выполняется из скрипта, included.phpв который помещен код.
Остерегайтесь, следующее НЕ эквивалентно описанному выше трюку, вопреки тому, что можно прочитать в другом месте:
include '/../../index.php';
Действительно, предварительное добавление /будет работать, но оно будет разрешено так же, как и include ../../index.phpв вызывающем скрипте (разница в том, что в include_pathслучае сбоя последующие действия не будут выполняться).Из документа PHP :
Если путь определен - абсолютный (начиная с буквы диска или \ в Windows, или / в системах Unix / Linux) или относительно текущего каталога (начиная с. Или ..) - include_path будет полностью проигнорирован.