#php #path #include
#php #путь #включить
Вопрос:
У меня есть эта папка и файловая структура:
- public_html (папка)
- index.php (файл)
- ресурсы (папка)
- конфигурации (папка)
- main_config.php (файл)
- render_template.php (file) — (этот файл находится на том же уровне, что и папка configs, внутри папки resources)
- конфигурации (папка)
В index.php Я звоню:
require_once("../resources/render_template.php");
В render_template.php Я звоню:
require_once("configs/main_config.php");
Или: (оба работают)
require_once("../resources/configs/main_config.php");
Мои вопросы:
- Почему это
require_once("configs/main_config.php")
работает? Разве путь теперь не должен быть относительно index.php потому что render_template.php файл включен в index.php что означает, что нужно добавить ../resources/, чтобы покинуть папку public_html? - Если первый способ правильный, почему
require_once("../resources/configs/main_config.php");
тогда работает?
Ответ №1:
То, как это работает, совсем не странно. Это следует логическому шаблону.
- Почему это
require_once("configs/main_config.php")
работает?
Это работает, потому что он не оценивает относительный путь на основе того, где включен этот «родительский» файл. main_config.php
включено в render_template.php
. Ему не нужно знать, где render_template.php
он может быть включен.
Если бы это действительно зависело от того, куда включен родительский файл, тогда вам нужно было бы по-разному определять относительный путь для файлов из разных папок, что, очевидно, не может работать. Он должен быть универсальным, чтобы скрипт можно было включать везде, где это необходимо.
Это достигается путем первого включения файлов на «самом низком» уровне. index.php
включает render_template.php
в себя то, что включает main_config.php
. Это означает, что перед render_template.php
index.php
main_config.php
добавлением содержимого содержимое будет добавлено render_template.php
. Таким образом, они в конечном итоге будут добавлены index.php
в то место, где require_once("../resources/render_template.php")
вызывается.
- Если первый способ правильный, почему
require_once("../resources/configs/main_config.php");
тогда работает?
Нет причин, по которым это не работает. Если вы примете то, что мы указали в первом ответе (что он не зависит от того, где включен «родительский»), он следует точному пути:
- В настоящее время мы находимся внутри
resources
папки, вrender_template.php
. - Мы перемещаемся на один уровень выше (
..
) в «корневую» папку (которая содержит обеpublic_index
resources
папки и). - Мы возвращаемся в
resources
папку. Остальное просто.
Комментарии:
1. Этот ответ очень хороший, большое вам спасибо. Но у меня есть еще один вопрос, в main_config.php файл (который находится в папке configs) Я пытаюсь require_once(«../paths.php «); файл путей находится на том же уровне, что и файл render_template (в папке ресурсов), но он выдает мне предупреждение: require_once(../paths.php ): не удалось открыть поток: нет такого файла или каталога. Итак, следуя той же логике, которую вы объяснили, он должен работать, потому что он не смотрит, где находится main_config или render_template , но это не так? Изменение пути на «.. /resources/paths.php » заставляет это работать.
2. Вы допускаете ошибку там. Вам нужно только
require_once("paths.php");
, если они находятся на одном уровне.../
поднимает вас на один уровень выше , и этого файла там нет.3. По какой-то причине «/paths.php «тоже не работает, только»../resources/paths.php «.
4. Извините, я исправил это в приведенном выше комментарии. Я неуместен
/
.5. Я тоже пробовал это, но не работает:/ Вот структура: ресурсы (папка) — конфигурации (папка) — main_config.php (файл) — render_template.php (файл) — (этот файл находится на том же уровне, что и папка configs, внутри папки resources) — paths.php — (то же место, что и в приведенном выше файле, за пределами папки configs) «.. / пути», «пути» — не работает только «.. /resources/paths.php » работает по какой-то причине. Я добавил структуру папок обновления в этот комментарий, возможно, это поможет вам помочь мне. спасибо за ваше время.