PHP是否包含相对于文件或调用代码的路径?
我在理解PHP相对包含路径的规则集时遇到困难。如果我运行文件A.PHP,文件A.PHP包括文件B.PHP,其中包括文件C.PHP,那么到C.PHP的相对路径应该与B.PHP的位置相关,还是与A.PHP的位置相关?也就是说,从哪个文件调用include,或者只调用当前工作目录,以及确定当前工作目录的内容是否重要?它与主脚本相关,在本例中是A.php。请记住,PHP是否包含相对于文件或调用代码的路径?,php,include,relative-path,Php,Include,Relative Path,我在理解PHP相对包含路径的规则集时遇到困难。如果我运行文件A.PHP,文件A.PHP包括文件B.PHP,其中包括文件C.PHP,那么到C.PHP的相对路径应该与B.PHP的位置相关,还是与A.PHP的位置相关?也就是说,从哪个文件调用include,或者只调用当前工作目录,以及确定当前工作目录的内容是否重要?它与主脚本相关,在本例中是A.php。请记住,include()只是将代码插入当前运行的脚本中 也就是说,从哪个文件调用include是否重要 没有 如果你想让它变得重要,并且做一个相对于
include()
只是将代码插入当前运行的脚本中
也就是说,从哪个文件调用include是否重要
没有
如果你想让它变得重要,并且做一个相对于B.php的include,那么使用\uuuuuu FILE\uuuuuuu
常量(或者\uuuuu DIR\uuuuu
因为PHP5.2 IIRC),它将始终指向代码行所在的文本当前文件
include(dirname(__FILE__)."/C.PHP");
要在b
中包含a
,您需要包含(“../a.php”)代码>
要在c
中包含b
,您需要include(“dir2/b.php”)代码>@Pekka带我去了那里,但我只想分享我学到的东西:
返回开始执行的文件所在的目录
返回包含当前执行代码的文件的目录
使用这两个函数,您可以始终构建与所需内容相关的include路径
e、 例如,如果b.php和c.php共享一个目录,则b.php可以包括c.php,如:
include(dirname(__FILE__).'/c.php');
无论从何处调用b.php
事实上,这是建立相对路径的首选方法,因为额外的代码使PHP不必在试图定位目标文件时遍历include_路径
资料来源:
简短回答:它与包含脚本相关
正确解释它:
如果在include_路径中找不到该文件,include将检入调用脚本的目录和当前工作目录
因此,如果/app/main.php说包含(“./inc.php”)
,则会找到/app/inc.php
/不是严格必需的,但删除了对include\u路径的任何依赖关系
如果有人使用chdir()
对当前工作目录进行更改,我不会依赖于在其中查找include文件
如果包含路径不是以/
或./
开头,例如:
include 'C.php'; // precedence: include_path (which include '.' at first),
// then path of current `.php` file (i.e. `B.php`), then `.`.
include './C.php'; // relative to '.'
include '../C.php'; // also relative to '.'
如果包含路径以/
或./
开头,例如:
include 'C.php'; // precedence: include_path (which include '.' at first),
// then path of current `.php` file (i.e. `B.php`), then `.`.
include './C.php'; // relative to '.'
include '../C.php'; // also relative to '.'
上面的
或。
是相对于getcwd()
,它默认为条目.php
文件的路径(即A.php
)
在PHP5.4.3上测试(构建日期:2012年5月8日00:47:34)
(还要注意,chdir()
可以更改getcwd()
的输出)Pekka的公认答案是不完整的,并且在一般情况下会产生误导。如果文件是作为相对路径提供的,则被调用的语言构造include
将按以下方式搜索它
首先,它将通过环境变量include_path
的路径,可以使用ini_set
进行设置。如果失败,它将在调用脚本自己的目录中搜索dirname(\uuuuu FILE\uuuuu)
(\uuuuu DIR\uuuuu
,php>=5.3)。如果失败,它只会在工作目录中搜索!结果是,默认情况下,环境变量include_path
以当前工作目录
开头。这是它首先在当前工作目录中搜索的唯一原因。看
文件是根据给定的文件路径包含的,如果没有给定文件路径,
指定的包含路径。如果在中找不到该文件
include\u路径,include将最终检入调用脚本自己的
目录和失败前的当前工作目录
因此,问题第一部分的正确答案是,包含的调用脚本位于何处确实很重要。问题最后一部分的答案是,在web服务器上下文中,初始工作目录是被调用脚本的目录,该脚本在由PHP处理时包含所有其他脚本。在命令行上下文中,当在提示符处调用php时,初始工作目录是任何目录,而不一定是被调用脚本所在的目录。但是,可以在运行时使用PHP函数chdir
更改当前的工作目录。看
添加本段是为了对其他答案进行评论。一些人提到,依赖于包含路径
的健壮性较差,因此最好使用完整路径,如/path
或\uuuuuu DIR\uuu/路径
。有些人甚至说,依赖工作目录
本身是不安全的,因为它可以更改。但是,有时需要依赖环境值。例如,您可能希望设置include_path
为空,以便调用脚本的目录是它将搜索的第一个位置,甚至在当前工作目录之前。代码可能已经从外部源定期编写和更新,您不希望每次更新代码时都重新插入前缀\uuuu DIR\uuu
@Pekka-太棒了-正是我想要的。欲了解更多信息,请参阅您也可以使用\uuuuu DIR\uuuuuu
来实现这一目的。这个答案有点过分:不需要包含(dirname(uuu文件)。“/C.PHP”)代码>,因为包含(“C.PHP”)
就足够了(是的!C.PHP可以与B.PHP位于同一目录中),只有当项目中有两个C.PHP文件时,它才可能失败。更清楚地说:如果没有,它与B.PHP和A.PHP都是相对的