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 doc :
Если путь определен - абсолютный ли (начиная с буквы диска
или \ в Windows, или / в системах Unix / Linux) или относительно
текущий каталог (начиная с. или ..) - include_path будет
полностью игнорируется.