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 будет полностью проигнорирован.