我将从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
指的是当前工作目录中的某个东西,而是在它没有之前找到{在当前工作目录中的{1}}中,相对于执行file.php
的文件,它在includes
中查找。似乎PHP如何处理相对路径有一个微妙的层次结构。
请注意,如果在require
中有includes/test.php
(前导require './file.php';
之前只有一个“裸”文件路径),则它可以按预期的方式运行 IFF < / strong>“上” ./
存在。也就是说,前导file.php
不会加载./
和致命错误。
实际上,所有这些归结为:请勿使用相对路径!改用绝对路径!这不是我要问的。
我想知道的是,这仅仅是UNIX吗?它是在OS级别强制执行的,还是只是通过编程语言中的约定强制执行的?其他语言的行为是否有所不同?
谢谢。
答案 0 :(得分:0)
它从来不是(或者至少很少是)操作系统。大多数(也许是所有)操作系统都具有解决相对路径名的固定不变方法。它几乎总是语言的东西或实现的东西;也就是说,该行为记录在语言标准或实施手册中。
例如,PHP require
和include_path
的行为为documented in the official PHP manual:
基于给定的文件路径或如果未给定的
include_path
包含文件。如果在include
中找不到该文件,则require
[和\
]最终将在失败之前检入调用脚本自己的目录和当前工作目录。如果定义了路径-是绝对路径(在Windows中以驱动器号或
/
开头,在Unix / Linux系统中以.
开头)还是相对于当前目录(以{{1开头) }}或..
)-include_path
将被完全忽略。例如,如果文件名以../
开头,则解析器将在父目录中查找以找到请求的文件。
当然,其他语言也有不同。例如,在C和C ++中,#include
指令由预处理步骤处理;这些语言的标准明确指出,对要包含的文件的搜索是实现定义的;实际的搜索规则由特定的编译器定义和记录。