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

tzcvj98z  于 2023-10-15  发布在  PHP
关注(0)|答案(6)|浏览(177)

我在理解PHP相对包含路径的规则时遇到了麻烦。如果我运行文件A.PHP-并且文件A. PHP包含文件B. PHP,而文件B. PHP包含文件C. PHP,那么C. PHP的相对路径应该与B. PHP的位置相关,还是与A.PHP的位置相关?也就是说,从哪个 * 文件 * 调用include重要吗?还是只关注当前工作目录是什么-以及是什么决定了当前工作目录?

ff29svar

ff29svar1#

它是相对于主脚本的,在本例中是A.php。请记住,include()只是将代码插入到当前运行的脚本中。
也就是说,从哪个文件调用include有关系吗

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

  1. include(dirname(__FILE__)."/C.PHP");
6pp0gazn

6pp0gazn2#

@Pekka让我在那里,但只是想分享我学到的:
getcwd()返回您开始执行的文件所在的目录。
dirname(__FILE__)返回包含当前执行代码的文件的目录。
使用这两个函数,您总是可以构建一个相对于您需要的包含路径。
例如,如果b.php和c.php共享一个目录,b.php可以包含c.php,如:

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

无论从何处调用b.php。
事实上,这是建立相对路径的首选方式,因为额外的代码使PHP不必在尝试定位目标文件时遍历include_path。
资料来源:
Difference Between getcwd() and dirname(FILE) ? Which should I use?
Why you should use dirname(FILE)

f3temu5u

f3temu5u3#

公认的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__

lbsnaicq

lbsnaicq4#

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

  1. include 'C.php'; // precedence: include_path (which include '.' at first),
  2. // then path of current `.php` file (i.e. `B.php`), then `.`.

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

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

上面的...是相对于getcwd()的,默认为条目.php文件的路径(即A.php),用于某些Web服务器,例如Apache。
在PHP 5.4.3上测试(构建日期:2012年5月8日00:47:34)。
(Also注意chdir()可以改变getcwd()的输出。

zynd9foi

zynd9foi5#

简短回答:它是相对于包含脚本而言的。
TFM正确解释:
如果在include_path中找不到该文件,则include将检查调用脚本的目录和当前工作目录
因此,如果**/app/main.php表示include("./inc.php"),则会找到/app/inc.php**。

**./**不是绝对必要的,但它删除了对include_path的任何依赖。

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

uemypmqf

uemypmqf6#

  1. dir
  2. -> a.php
  3. -> c.php
  4. - dir2
  5. -> b.php

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

相关问题