php - 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 的方法不会将其“移动”到调用它的文件的目录中?
解决方案
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';
推荐阅读
- go - 如何动态增加速率限制器限制?
- assembly - NASM 64 位 gcc 链接器错误。针对`.text`重定位R_X86_64_32S
- javascript - 使导航栏响应
- html - HTML - 如何强制视频包装器自动调整到页面布局
- python - BeautifulSoup 过滤功能:多种条件
- c# - 您可以在 Visual Studio Code 中自动生成步骤定义吗
- github - 识别 git repo 的组织名称
- c# - Gradle插件返回错误消息
- linux - bash - 获取正确处理新行的环境变量列表
- javascript - 将数据从父道具发送到子道具返回一个值,然后是未定义的功能组件