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

Yar*_*rin 102 php relative-path include

我无法理解有关PHP相对包含路径的规则集.如果我运行文件A.PHP-并且文件A.PHP包含文件B.PHP,其中包含文件C.PHP,那么C.PHP的相对路径是否与B.PHP的位置或A的位置有关.PHP?也就是说,调用包含哪个文件或者当前工作目录是什么以及确定当前工作目录的内容是否重要?

Pek*_*ica 122

它与主脚本相关,在本例中为A.php.请记住,include()只需将代码插入当前运行的脚本即可.

也就是说,调用include的文件是否重要

没有.

如果你想要什么关系,做一个包括相对于B.php,使用__FILE__恒定的(或__DIR__因为PHP 5.2 IIRC),这将始终指向的代码行位于字面当前文件.

include(dirname(__FILE__)."/C.PHP");
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`__DIR__`来达到这个目的. (6认同)

Yar*_*rin 21

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

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

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

使用这两个函数,您始终可以构建相对于您需要的包含路径.

例如,如果b.php和c.php共享一个目录,b.php可以包含c.php,如:

include(dirname(__FILE__).'/c.php');
Run Code Online (Sandbox Code Playgroud)

无论b.php从何处被召唤.

实际上,这是建立相对路径的首选方法,因为额外的代码可以使PHP免于在尝试定位目标文件时迭代include_path.

资料来源:

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

为什么你应该使用dirname(FILE)


Joh*_*ong 16

  1. 如果包含路径不以./或开头../,例如:

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果包含路径以./或开头../,例如:

    include './C.php';  // relative to '.'
    
    include '../C.php'; // also relative to '.'
    
    Run Code Online (Sandbox Code Playgroud)

所述...以上是相对于getcwd(),缺省条目的路径.php文件(即A.php).

在PHP 5.4.3上测试(构建日期:2012年5月8日00:47:34).

(另请注意,chdir()可以更改输出getcwd().)


小智 12

Pekka的公认答案是不完整的,并且在一般情况下是误导性的.如果文件作为相对路径提供,则被调用语言构造include将按以下方式搜索它.

首先,它将通过环境变量的路径include_path,可以设置ini_set.如果失败,它将在调用脚本自己的目录中搜索dirname(__FILE__)(__DIR__使用php> = 5.3.)如果这也失败了,那么它只会在工作目录中搜索!事实证明,默认情况下,环境变量include_path.当前工作目录开头.这是它首先在当前工作目录中搜索的唯一原因.见http://php.net/manual/en/function.include.php.

根据给定的文件路径包含文件,如果没有给出,则指定include_path.如果在include_path中找不到该文件,include将最终在失败前检入调用脚本自己的目录和当前工作目录.

因此,问题第一部分的正确答案是,包含的调用脚本位于何处.问题的最后一部分的答案是,在Web服务器上下文中的初始工作目录是被调用脚本的目录,该脚本在由PHP处理时包括所有其他脚本.在命令行上下文中,初始工作目录是在提示符处调用php时的任何内容,而不一定是被调用脚本所在的目录.在当前的工作目录,但是,可以在运行时与PHP函数改变chdir.见http://php.net/manual/en/function.chdir.php.

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


Den*_*owe 6

简短回答:它与包含脚本有关。

TFM正确解释:

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

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

./不是绝对必要的,但消除了对包含路径的任何依赖。

我不会依赖于在当前工作目录中查找包含文件,以防有人使用chdir().

  • @Denis Howe 不,如果您的包含路径以`./` 开头,则您已经依赖于当前工作目录。即 chdir("/app/other") 将使 `include("./inc.php")` 失败。因此,在这种情况下使用 `include("inc.php")` 是安全的。 (2认同)