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

我很难理解关于 PHP 相对包含路径的规则集。如果我运行文件 A.PHP-文件 A.PHP 包含文件 B.PHP,其中包含文件 C.PHP,那么到 C.PHP 的相对路径应该与 B.PHP 的位置相关,还是应该与 A.PHP 的位置相关?也就是说,从哪个包含被调用,或者只是当前的工作目录是什么,以及是什么决定了当前的工作目录,这些都重要吗?

102995 次浏览

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

也就是说,从哪个文件调用 include 是否重要

没有。

如果希望使用 制造,并且相对于 B.PHP 执行 include,那么可以使用 __FILE__常量(或者自 PHP 5.2 IIRC 以来的 __DIR__) ,它总是指向代码行所在的文本当前文件。

include(dirname(__FILE__)."/C.PHP");
dir
-> a.php
-> c.php


- dir2
-> b.php

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

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

@ Pekka 把我带到了那里,但我只想分享我学到的东西:

getcwd() returns the directory where the file you started executing resides.

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

使用这两个函数,您总是可以构建与所需内容相关的 include 路径。

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

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

不管 b.php 是从哪里打来的。

实际上,这是建立相对路径的首选方法,因为额外的代码使 PHP 不必在尝试定位目标文件时迭代 include _ path。

资料来源:

Getcwd ()和 dirname (_ _ FILE _ _)之间的区别? 我应该使用哪个?

为什么要使用 dirname (_ _ FILE _ _)

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

TFM 正确地解释了它:

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

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

严格来说,./并不是必需的,但它消除了对 include _ path 的任何依赖。

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

  1. 如果 include 路径不以 ./../开始,例如:

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

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

The . or .. above is relative to getcwd(), which defaults to the path of the entry .php file (i.e. A.php).

Tested on PHP 5.4.3 (Build Date : May 8 2012 00:47:34).

(Also note that chdir() can change the output of getcwd().)

公认的佩卡答案是不完整的,而且在一般情况下具有误导性。如果文件是作为相对路径提供的,则被调用的语言结构 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。有些人甚至说,依赖工作目录 ABc3本身并不安全,因为它是可以改变的。但是,有时候,您需要依赖于环境值。例如,您可能希望将 include_path设置为空,以便调用脚本的目录是它将搜索的第一个位置,甚至在当前工作目录之前。代码可能已经从外部来源定期编写和更新,您不希望每次更新代码时都重新插入前缀 __DIR__