Если у меня есть файл по адресу mysite.com/pages/page1.php и файл header.php, который находится в домашнем каталоге (mysite.com/header.php), как можно включить header.php?
Я старался include($_SERVER['DOCUMENT_ROOT'] . "/header.php");
или же "../header.php");
Это не работает, потому что ничего, что включено или на которое есть ссылка в header.php, не работает. Например include("meta.php");
не работает Ни один не делает include($_SERVER['DOCUMENT_ROOT'] . "/meta.php");
Есть ли другой способ вызвать header.php, который не «перемещает» его в каталог файла, вызывающего его?
PHP предоставляет как минимум два «рабочих пути» для ваших файлов:
getcwd()
, который возвращает текущий рабочий каталог (объясняет его имя),dirname(__FILE__)
, который возвращает текущий путь скрипта.Вы можете найти больше информации здесь о getcwd
:
Согласно документации include
заявление ( https://secure.php.net/manual/en/function.include.php ):
Оператор include включает и оценивает указанный файл.
[…]Файлы включаются на основе заданного пути к файлу или, если он не указан, указан include_path. Если файл не найден в include_path, include наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог, прежде чем произойдет сбой.
Согласно документу, include
будет использовать каталог скрипта, который в вашем случае является вашим текущим рабочим каталогом (cwd).
Теперь у вас следующая ситуация:
/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';
Других решений пока нет …