如果我在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而不将其“移动”到调用它的文件的目录中?
答案 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';