【问题标题】:File Referencing in PHPPHP中的文件引用
【发布时间】:2018-05-09 22:31:19
【问题描述】:

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

【问题讨论】:

  • 来自mysite.com/pages/page1.php家将是../../header.php
  • 启用错误报告,包含不会静默失败。使用 realpath() 和 file_exists() 进行调试。
  • 它只是说“加载资源失败:服务器响应状态为 404(未找到)”。我可以访问 header.php,但它没有引用任何内容,因为它认为 header.php 现在位于 pages 文件夹中。至少我认为这就是原因。
  • DOCUMENT_ROOT 会给你绝对路径。检查它在您的服务器中指向的位置。 echo $_SERVER['DOCUMENT_ROOT'] 也可以在DOCUMENT_ROOT 后面附加文件名并检查它是否指向真实的位置和文件。
  • 嗯我在 header.php 中引用了一个 css,看起来它正试图在“https://mysite.com/home/myname/mysite.com/css/styles.css ”。这似乎不对。但无论哪种方式,我都不应该修改 header.php 中的任何内容,因为我知道它调用的所有内容在从主目录调用时都有效。 header.php 在主目录中。

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


【解决方案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 语句会尝试使用当前工作目录。


可能的解决方案

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

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

【讨论】:

  • 感谢您的回复 :) 我想我现在正在进入 meta.php,但是有很多链接,例如“”,它也需要像“dirname(FILE)”这样的东西。但那些不再在 php 中了。
  • 我查看了 getcwd() 并发现显然您可以使用 chdir() 更改当前工作目录。似乎这正是我所需要的,如果我可以将它放在不在 mysite.com 主目录中的页面的顶部。但它似乎没有用。
  • 必须编辑可能包含在 page1.php 中的每个文件中的链接会很糟糕,因为其中一些可能包含数百个链接。
  • 我认为有一个 html 标签可以帮助你:w3schools.com/tags/tag_base.asp
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2011-05-04
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多