PHP предоставляет как минимум два «рабочих пути» для ваших файлов:
- Функция
getcwd()
, которая возвращает текущий рабочий каталог (объясняет его имя), dirname(__FILE__)
, который возвращает текущий путь скрипта.
Более подробную информацию можно найти здесь о getcwd
:
Согласно документации оператора include
(https://secure.php.net/manual/en/function.include.php):
Оператор include включает и оценивает указанный файл.
[...]
Файлы включаются на основе заданного пути к файлу или, если он не указан, указан include_path.Если файл не найден в include_path, include наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог перед сбоем.
Согласно документу, include
будет использовать скрипткаталог, который в вашем случае ваш текущий рабочий каталог (cwd).
Ситуация
Теперь у вас есть следующая ситуация:
- Aфайл в
/meta.php
, - Файл в
/header.php
, который должен включать /meta.php
, - Файл в
/pages/page1.php
, который должен включать /header.php
.
Вопрос: где находится ваш рабочий каталог?Если вы запустите скрипт /pages/page1.php
, ваш рабочий каталог будет /pages/
.
Итак, чтобы получить доступ к /header.php
, вы должны использовать это утверждение внутри /pages/page1.php
:
include '../../header.php';
Или:
include $_SERVER['DOCUMENT_ROOT'] . '/header.php';
Эти операторы являются эквивалентами из-за пути /header.php
.
В /header.php
следующий оператор завершится ошибкой:
include 'meta.php';
Зачем ?Поскольку текущим рабочим каталогом является /pages/
, то include 'meta.php';
относится к include '/pages/meta.php';
, которые не существуют, что приводит к ошибке.Помните, что оператор include
пытается использовать текущий рабочий каталог, если URL-адрес является относительным.
Возможное решение
Доступ к файлу /meta.php
из /header.php
, вы можете:
- Использовать
include '../../meta.php';
в /header.php
, если вы вызываете скрипт из файла /pages/page1.php
, - Использовать
include dirname(__FILE__) . '/meta.php';
в /header.php
, - Используйте
include $_SERVER['DOCUMENT_ROOT'] . '/meta.php';
в header.php
.
В вашем случае $_SERVER['DOCUMENT_ROOT']
, вероятно, совпадает с dirname(__FILE__)
, поскольку /header.php
находится в корневом пути документа,Однако первый оператор действителен только в том случае, если путь header.php
является корневым.Последнее лучше, потому что оно зависит только от пути к текущему файлу.
Какой использовать?
Второе решение, вероятно, лучше, потому что, например, следующий оператор в/pages/subfolder/page.php
не удастся:
include '../../../header.php';
Файл /header.php
будет правильно включен, но если он содержит оператор include '../../meta.php';
, он будет ссылаться на include '/pages/meta.php';
, поскольку ваш рабочий подкаталог - /pages/subfolder/
.
Рекомендуется использовать альтернативу dirname(__FILE__)
, если вы хотите включить скрипт относительно текущего файла независимо от текущего рабочего каталога.Только не забудьте окончательный /
, потому что dirname
дает папку текущего скрипта без него.
В заключение
В /pages/page1.php
, используйте:
include '../../header.php';
В /header.php
, используйте:
include dirname(__FILE__) . '/meta.php';