PHP是否包含相对于文件或调用代码的path?

我无法理解关于PHP相对包含path的规则集。 如果我运行文件A.PHP-并且文件A.PHP包括文件B.PHP,其中包括文件C.PHP,C.PHP的相对path应该与B.PHP的位置相关,还是与A的位置相关.PHP? 也就是说,调用include的是哪个文件 ,还是仅仅当前的工作目录是什么,以及决定当前工作目录的是什么?

这是相对于主脚本,在这种情况下,A.php。 请记住, include()只是将代码插入到当前正在运行的脚本中。

也就是说,包含被调用的文件是否重要?

没有。

如果你想使它重要,并做一个相对B.php包括,使用__FILE__常量(或__DIR__自PHP 5.2 IIRC),它将始终指向该行代码所在的文字当前文件。

 include(dirname(__FILE__)."/C.PHP"); 

@Pekka让我在那里,但只是想分享我学到的东西:

getcwd()返回开始执行的文件所在的目录。

dirname(__FILE__)返回包含当前执行代码的文件的目录。

使用这两个函数,你总是可以build立一个相对于你所需要的包含path。

例如,如果b.php和c.php共享目录,b.php可以包含c.php,如下所示:

 include(dirname(__FILE__).'/c.php'); 

不pipe在哪里调用b.php。

实际上,这是build立相对path的首选方式,因为额外的代码使PHP不必通过遍历include_path来尝试定位目标文件。

资料来源:

getcwd()和dirname(__ FILE__)之间的区别? 我应该用哪个?

为什么你应该使用dirname( FILE

佩卡接受的答案是不完整的,在一般情况下,误导。 如果文件是作为相对path提供的,则被调用的语言构造include将按照以下方式search它。

首先,它将通过环境variablesinclude_path的path,这可以通过ini_set来设置。 如果失败,它会在调用脚本的目录dirname(__FILE__) __DIR__ dirname(__FILE__) __DIR__ dirname(__FILE__) ,php> = 5.3)中search。如果这也失败了,那么只有在工作目录中search! 事实certificate,默认情况下,环境variablesinclude_path开头. ,这是当前的工作目录。 这是它在当前工作目录中首先search的唯一原因。 参见http://php.net/manual/en/function.include.php

包含的文件基于给定的文件path,如果没有给出,则指定include_path。 如果在include_path中找不到该文件,include将最终在调用脚本自己的目录和当前工作目录中检查失败之前。

所以,问题的第一部分的正确答案是,它包含的调用脚本位于何处。 问题的最后一部分的答案是,在Web服务器上下文中, 最初的工作目录是被调用的脚本的目录,这个脚本包含所有其他的被PHP处理的脚本。 在命令行上下文中,最初的工作目录是在提示符处调用php时的最初工作目录,不一定是被调用脚本所在的目录。 但是, 当前的工作目录可以在运行时使用PHP函数chdir进行更改。 见http://php.net/manual/en/function.chdir.php

添加此段以评论其他答案。 有人提到,依靠include_path是不太健壮的,因此最好使用完整的path,如./path__DIR__ . /path __DIR__ . /path 。 有的甚至说依靠工作目录. 本身并不安全,因为它可以被改变。 但有时候,你需要依靠环境价值。 例如,您可能需要将include_path设置为空,以便调用脚本的目录是它将search的第一个位置,甚至在当前工作目录之前。 代码可能已经从外部源定期写入和更新,并且您不希望每次代码更新时都重新插入前缀__DIR__

  1. 如果包含path不以./../开头,例如:

     include 'C.php'; // precedence: include_path (which include '.' at first), // then path of current `.php` file (ie `B.php`), then `.`. 
  2. 如果包含path以./../开头,例如:

     include './C.php'; // relative to '.' include '../C.php'; // also relative to '.' 

...以上是相对于getcwd() ,它默认的条目.php文件(即A.php )的path。

testingPHP 5.4.3(生成date:2012年5月8日00:47:34)。

(还要注意, chdir()可以改变getcwd()的输出。)

简短的回答:这是相对于包括脚本。

TFM解释正确:

如果在include_path中找不到该文件,include将检查调用脚本的目录和当前工作目录

所以,如果/app/main.phpinclude("./inc.php") ,将会find/app/inc.php

./并不是绝对必要的,但是会消除对include_path的依赖。

我不会依赖在当前工作目录中find包含文件,以防有人用chdir()更改它。

 dir -> a.php -> c.php - dir2 -> b.php 

要包含a b你需要include("../a.php");

要在c包含b ,你需要include("dir2/b.php");