Home » Программирование » Короткие заметки » Опасность вложенных include с директивами «../» в путях к файлам в PHP

Опасность вложенных include с директивами «../» в путях к файлам в PHP

Успешность подключения файла с помощью директивы 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 почему-то не отслеживают подобные скрытые баги, хотя просчитать целостность цепочки подключения не составляет никакого труда.

Избежать скрытых проблем из-за подключения файлов по относительным путям с директивами «../» в некотором исходном скрипте можно, соблюдая следующие условия:

  1. Вы на 100% уверены, что все файлы, которые будут подключаться по нижестоящей цепочке, прописаны без «../».
  2. Сам скрипт не будет подключаться в другие скрипты.

Только в этих случаях использование «../» в include не чревато никакими проблемами и позволяет сделать код более лаконичным.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Do NOT follow this link or you will be banned from the site!