У меня проблемы с пониманием набора правил, касающихся относительных путей включения PHP. Если я запускаю файл A.PHP- и файл A.PHP включает файл B.PHP, который включает файл C.PHP, должен ли относительный путь к C.PHP быть относительно местоположения B.PHP или местоположения A .PHP? То есть имеет значение, из какого файла вызывается include, или только из того, что является текущим рабочим каталогом, и что определяет текущий рабочий каталог?
php
include
relative-path
Ярин
источник
источник
Ответы:
Это относительно основного скрипта, в данном случае A.php. Помните, что это
include()
просто вставляет код в текущий скрипт.Нет.
Если вы хотите сделать это важным и выполнить включение относительно B.php, используйте
__FILE__
константу (или__DIR__
начиная с PHP 5.2 IIRC), которая всегда будет указывать на буквальный текущий файл, в котором находится строка кода.источник
__DIR__
для этой цели.include(dirname(__FILE__)."/C.PHP");
, потому что этогоinclude("C.PHP");
достаточно (да! C.PHP может находиться в том же каталоге, что и B.PHP). Он может завершиться ошибкой только тогда, когда в вашем проекте есть два файла C.PHP.@Pekka привел меня туда, но я просто хочу поделиться тем, что я узнал:
getcwd()
возвращает каталог, в котором находится файл, который вы начали выполнять.dirname(__FILE__)
возвращает каталог файла, содержащего исполняемый в данный момент код.Используя эти две функции, вы всегда можете создать путь включения относительно того, что вам нужно.
например, если b.php и c.php совместно используют каталог, b.php может включать c.php, например:
независимо от того, откуда был вызван b.php.
Фактически, это предпочтительный способ установки относительных путей, поскольку дополнительный код освобождает PHP от необходимости повторять include_path в попытке найти целевой файл.
Источники:
Разница между getcwd () и dirname (__ FILE__)? Что мне использовать?
Почему вам следует использовать dirname (__ FILE__)
источник
Если путь включения не начинается с
./
или../
, например:Если путь включения начинается с
./
или../
, например:Значение
.
или..
выше относится кgetcwd()
, что по умолчанию соответствует пути к входному.php
файлу (т.е.A.php
).Протестировано на PHP 5.4.3 (Дата сборки: 8 мая 2012 г., 00:47:34).
(Также обратите внимание, что
chdir()
можно изменить выводgetcwd()
.)источник
chdir(__DIR__)
для решения проблемы.getcwd()
, который по умолчанию соответствует пути к файлу входа .php [...] - не обязательно верно. Если я запускаю PHP в командной строке, онgetcwd()
обращается к текущему рабочему каталогу оболочки, независимо от того, какой.php
файл я вызываю. Однако я могу представить, что если PHP запускается в среде веб-сервера, среда инициализирует текущий рабочий каталог в.php
файл записи . Протестировано на macOS с PHP 7.2.2, установленным через Homebrew.Принятый ответ Пекки неполон и в общем контексте вводит в заблуждение. Если файл указан как относительный путь, вызываемая языковая конструкция
include
будет искать его следующим образом.Во-первых, он пройдется по путям переменной окружения
include_path
, которую можно установить с помощьюini_set
. Если это не удается, он будет искать в собственном каталоге вызывающего скриптаdirname(__FILE__)
(__DIR__
с php> = 5.3.). Если и это не удается, только тогда он будет искать в рабочем каталоге! Оказывается, по умолчанию переменная окруженияinclude_path
начинается с.
текущего рабочего каталога. Это единственная причина, по которой он сначала выполняет поиск в текущем рабочем каталоге. См. Http://php.net/manual/en/function.include.php .Итак, правильный ответ на первую часть вопроса состоит в том, что не имеет значения, где находится включенный вызывающий скрипт. Ответ на последнюю часть вопроса заключается в том, что исходный рабочий каталог в контексте веб-сервера - это каталог вызываемого скрипта, скрипта, который включает в себя все остальные, пока обрабатывается PHP. В контексте командной строки исходный рабочий каталог - это то, что он есть, когда php вызывается в командной строке, не обязательно каталог, в котором находится вызываемый скрипт. Однако текущий рабочий каталог можно изменить во время выполнения с помощью функции PHP
chdir
. См. Http://php.net/manual/en/function.chdir.php .Этот абзац добавлен для комментариев к другим ответам. Некоторые упомянули, что использование в системе
include_path
менее надежно и поэтому предпочтительнее использовать полные пути, такие как./path
или__DIR__ . /path
. Некоторые дошли до того, что полагаться на сам рабочий каталог.
небезопасно, потому что его можно изменить. Однако иногда вам нужно полагаться на ценности среды. Например, вы можете указатьinclude_path
пустое значение, чтобы каталог вызывающего скрипта был первым местом, в котором он будет искать, даже до текущего рабочего каталога. Код может быть уже написан и регулярно обновляться из внешних источников, и вы не хотите повторно вставлять префикс__DIR__
каждый раз при обновлении кода.источник
dirname(__FILE__)
(__DIR__)
с php> = 5.3.)" Вы уверены? Где это задокументировано? Я надеюсь, что вы ошибаетесь, и PHP не использует__FILE__
и__DIR__
для этой цели, так как это сразу нарушит включение «родственных» скриптов из символьных ! : -o (Что, к счастью, здесь работает нормально, на моей настройке 7.1.)Краткий ответ: это относительно включающего скрипта.
TFM правильно объясняет это:
Итак, если /app/main.php говорит,
include("./inc.php")
что найдет /app/inc.php ../ не является строго необходимым , но удаляет какую - либо зависимость от include_path.
Я бы не стал полагаться на поиск включаемых файлов в текущем рабочем каталоге на случай, если кто-то изменит его с помощью
chdir()
.источник
./
, проверяет ли она сначала каталог вызывающего сценария или текущий рабочий каталог?./
. т.е. chdir ("/ app / other") приведет кinclude("./inc.php")
ошибке. Таким образом,include("inc.php")
будьте осторожны в этом случае.Чтобы включить
a
вb
вам нужноinclude("../a.php");
Чтобы включить
b
вc
вам нужноinclude("dir2/b.php");
источник