Ссылка на файл в PHP - PullRequest
       50

Ссылка на файл в PHP

0 голосов
/ 10 мая 2018

Если у меня есть файл по адресу 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, который не "перемещает" его в каталог файла, который его вызывает?

1 Ответ

0 голосов
/ 10 мая 2018

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';
...