首页 > 解决方案 > PHP中的文件引用

问题描述

如果我有一个位于 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 的方法不会将其“移动”到调用它的文件的目录中?

标签: phpreferenceincludedocument-rootfile-structure

解决方案


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';不存在的,导致报错。请记住,include如果 URL 是相对的,则该语句会尝试使用当前工作目录。


一个可能的解决方案

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

  • 如果您从文件中调用脚本,请使用include '../../meta.php';in ,/header.php/pages/page1.php
  • 中使用include dirname(__FILE__) . '/meta.php';/header.php
  • include $_SERVER['DOCUMENT_ROOT'] . '/meta.php';中使用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';

推荐阅读