Как разные языки программирования относятся к относительным путям? - PullRequest
0 голосов
/ 29 ноября 2018

Начну с примера из 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?Это осуществляется на уровне ОС или просто по соглашению в языках программирования?Другие языки ведут себя по-другому?

Спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Это никогда (или, по крайней мере, очень редко) операционная система;большинство (возможно, все) операционных систем имеют фиксированный неизменный метод разрешения относительных имен путей.Это почти всегда либо язык, либо реализация;то есть поведение задокументировано либо в стандарте языка, либо в руководстве по реализации.

Например, поведение PHP include и require задокументировано в официальном руководстве по PHP :

Файлы включаются на основе заданного пути к файлу или, если он не указан, указаны include_path.Если файл не найден в include_path, includerequire] наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог, прежде чем произойдет сбой.

Если путь определен- абсолютное значение (начиная с буквы диска или \ в Windows или / в системах Unix / Linux) или относительно текущего каталога (начиная с . или ..) - include_path будетполностью игнорируется.Например, если имя файла начинается с ../, анализатор будет искать в родительском каталоге, чтобы найти запрошенный файл.

Конечно, другие языки делают это по-другому.Например, в C и C ++ директивы #include обрабатываются на этапе предварительной обработки;стандарты этого языка прямо говорят, что поиск включаемого файла определяется реализацией;фактические правила поиска определяются и документируются конкретным компилятором.

...