PHP中的文件引用

时间:2018-05-09 22:31:20

标签: php reference include document-root file-structure

如果我在mysite.com/pages/page1.php上有一个文件,并且在主目录(mysite.com/header.php)中有一个文件header.php,那么包含header.php的方法是什么?

我尝试了include($_SERVER['DOCUMENT_ROOT'] . "/header.php");"../header.php");

这不起作用,因为header.php中包含或引用的内容都不起作用。例如,include("meta.php");不起作用。 include($_SERVER['DOCUMENT_ROOT'] . "/meta.php");

也没有

是否有另一种方法可以调用header.php而不将其“移动”到调用它的文件的目录中?

1 个答案:

答案 0 :(得分:1)

PHP为您的文件提供至少两个“工作路径”:

  • 函数getcwd(),它返回当前工作目录(它解释了它的名字),
  • dirname(__FILE__),返回当前脚本的路径。

您可以在此处找到有关getcwd的更多信息:

根据include声明(https://secure.php.net/manual/en/function.include.php)的文档:

  

include语句包含并评估指定的文件。

     

[...]

     

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

根据文档,include将使用脚本的目录,在您的情况下是您当前的工作目录(cwd)。

情况

现在,您遇到以下情况:

  • /meta.php的文件,
  • /header.php的文件,需要包含/meta.php
  • /pages/page1.php的文件,需要包含/header.php

问题是:你的工作目录在哪里? 如果您运行脚本/pages/page1.php,则您的工作目录为/pages/

因此,要访问/header.php,您必须在/pages/page1.php

中使用此声明
include '../../header.php';

或者:

include $_SERVER['DOCUMENT_ROOT'] . '/header.php';

由于/header.php的路径,这些陈述是等价的。

/header.php中,以下语句将失败:

include 'meta.php';

为什么?由于您当前的工作目录为/pages/,因此include 'meta.php';引用不存在的include '/pages/meta.php';,从而导致错误。请记住,如果URL是相对的,include语句会尝试使用当前工作目录。

可能的解决方案

要从/meta.php访问/header.php文件,您可以:

  • 如果您使用include '../../meta.php';文件调用脚本,请在/header.php中使用/pages/page1.php
  • include dirname(__FILE__) . '/meta.php';
  • 中使用/header.php
  • include $_SERVER['DOCUMENT_ROOT'] . '/meta.php';。{/ li>中使用header.php

在您的情况下,$_SERVER['DOCUMENT_ROOT']可能与dirname(__FILE__)相同,因为/header.php位于文档根路径。但是,前一个语句仅在header.php路径为文档根目录时才有效。后者更好,因为它只取决于当前文件的路径。

使用哪一个?

第二种解决方案可能更好,因为例如/pages/subfolder/page.php中的以下语句将失败:

include '../../../header.php';

/header.php文件将被正确包含,但如果它包含include '../../meta.php';语句,则会引用include '/pages/meta.php';,因为您的工作子目录是/pages/subfolder/

当您想要从当前文件中包含相对于当前工作目录的脚本时,使用dirname(__FILE__)替代方法是一个很好的设计。只是不要忘记最后的/因为dirname给出了没有它的当前脚本的文件夹。

总结

/pages/page1.php中,使用:

include '../../header.php';

/header.php中,使用:

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