Успешность подключения файла с помощью директивы include (require), который, в свою очередь, содержит подключение другого файла и так далее, зависит от того, как прописаны пути к подключаемым файлам.
Всегда и везде будут работать подключения файлов по абсолютным путям, или по путям, начинающимся от текущей для подключаемого файла папки:
include __DIR__ . "/config/main.php"; // Абсолютный путь include __DIR__ . "/../config/main.php"; // Абсолютный путь с директивой "../" include "main.php" // Файл в той же папке. Это сокращение от "./main.php" include "app/config/main.php"; // Относительный путь от текущей папки app
Если же вы задаёте положение подключаемого файла в виде относительного пути, начинающегося с «висящих» директив «../», то будьте готовы к сюрпризам: подключение файла, содержащего в свою очередь подключение других файлов по путям с «../» будет работать только для файлов из одной единственной папки. Во всех остальных случаях будет ошибка.
Пример подключения, которое будет работать только при вызове из файлов одной папки:
include "../../app/config/main.php"
Мораль — избегайте «висящих» «../» в путях к файлам в директивах include и require.
Они работают так, что относительный путь отсчитывается от расположения самого первого вызывающего скрипта, а не от того промежуточного скрипта, в котором происходит подключение следующего по очереди скрипта. Интегрированные среды разработки (IDE) типа phpStorm почему-то не отслеживают подобные скрытые баги, хотя просчитать целостность цепочки подключения не составляет никакого труда.
Избежать скрытых проблем из-за подключения файлов по относительным путям с директивами «../» в некотором исходном скрипте можно, соблюдая следующие условия:
- Вы на 100% уверены, что все файлы, которые будут подключаться по нижестоящей цепочке, прописаны без «../».
- Сам скрипт не будет подключаться в другие скрипты.
Только в этих случаях использование «../» в include не чревато никакими проблемами и позволяет сделать код более лаконичным.