Начну с примера из PHP.Скажем, у меня есть такая структура файла:
.
└── includes
├── file.php
└── test.php
И скажите, что мой код выглядит следующим образом:
// includes/test.php
require 'file.php';
// includes/file.php
echo 'SUBDIR';
Теперь, если я запускаю php includes/test.php
, я получаю SUBDIR
в качестве вывода.Это неудивительно.
Но скажем, я добавляю файл на ./file.php
, который говорит echo 'ROOT!';
.Теперь мое дерево выглядит так:
.
├── file.php
└── includes
├── file.php
└── test.php
И когда я запускаю php includes/test
, оно выдает ROOT!
.Я нахожу это немного удивительным.
Когда я думаю об этом, меня удивляет не то, что file.php
ссылается на что-то в текущем рабочем каталоге, а на тот момент, когда не делал't find file.php
в текущем рабочем каталоге, он выглядит в includes
относительно файла, выполняющего require
.Кажется, есть тонкая иерархия в том, как PHP обрабатывает относительные пути.
Обратите внимание, что если в includes/test.php
у меня вместо этого require './file.php';
(ведущий ./
, где раньше был только "пустой" путь к файлу), он работает как ожидалось IFF «верхний» file.php
существует.То есть с ведущим ./
он не загружает includes/file.php
и фатальные ошибки.
Практически все это сводится к: Не используйте относительные пути!Вместо этого используйте абсолютные пути! Это не то, о чем я спрашиваю.
Мне интересно, Это просто UNIX?Это осуществляется на уровне ОС или просто по соглашению в языках программирования?Другие языки ведут себя по-другому?
Спасибо.