Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP是否包含相对于文件或调用代码的路径?_Php_Include_Relative Path - Fatal编程技术网

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是否重要 没有 如果你想让它变得重要,并且做一个相对于

我在理解PHP相对包含路径的规则集时遇到困难。如果我运行文件A.PHP,文件A.PHP包括文件B.PHP,其中包括文件C.PHP,那么到C.PHP的相对路径应该与B.PHP的位置相关,还是与A.PHP的位置相关?也就是说,从哪个文件调用include,或者只调用当前工作目录,以及确定当前工作目录的内容是否重要?

它与主脚本相关,在本例中是A.php。请记住,
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都是相对的