PHP - 文件包含
在开发网站时,我们通常需要在多个地方重用相同的信息或代码。例如,我们可能希望所有页面都有相同的 header、footer 或菜单。PHP 允许我们使用文件包含,而不必多次编写相同的代码!
文件包含可以节省时间,组织我们的代码,并允许我们进行简单的更改。当我们对一个文件进行更改时,所有包含该文件的其他文件都会随之更改。
PHP 中的文件包含类型
你可以在服务器执行 PHP 文件之前,将一个 PHP 文件的内容包含到另一个 PHP 文件中。有两个 PHP function 可以用来将一个 PHP 文件包含到另一个 PHP 文件中。
Include() Function
Require() Function
Include_once() and Require_once() Function
这是 PHP 的一个强项,它有助于创建可以在多个页面重用的 function、header、footer 或元素。这将帮助开发者轻松更改整个网站的布局,只需最少的努力。如果需要任何更改,只需更改包含的文件,而不必更改数千个文件。
include() Function
include() function 会将指定文件中的所有文本复制到使用 include function 的文件中。如果加载文件时出现任何问题,include() function 会生成一个警告,但脚本会继续执行。
Syntax
以下是 include function 的语法 −
include 'filename.php';
在这里,filename.php 是你想要包含的文件。它可以是相对路径或绝对路径。
Example
假设你想为你的网站创建一个通用菜单。然后创建一个名为 menu.php 的文件,内容如下。
<a href="https://www.example.com">Home</a> <a href="https://www.example.com">ebXML</a> <a href="https://www.example.com">AJAX</a> <a href="https://www.example.com">PERL</a>
现在你可以创建任意数量的页面,并包含此文件来创建 header。例如,现在你的 test.php 文件可以有以下内容。
<?php <b>include("menu.php");</b> ?>
<p>This is an example to show how to include PHP file!</p>
Output
它将产生以下结果 −
include() 方法的优势
在 PHP 中使用 include() 方法有几个优势 −
添加文件允许你在其他页面重用相同的内容,而无需更改任何代码。
你可以将网站的基本元素如 header、footer 和菜单添加到各种页面。
如果包含的文件有错误,include() 只会显示警告消息,脚本会继续运行。
如果你需要更改包含的文件(例如,更新 header 或 footer),只需更改一次,这些更改就会反映在所有使用它的页面上。
require() 函数
require() 函数会将指定文件中的所有文本复制到使用 include 函数的文件中。如果加载文件时出现任何问题,require() 函数会生成致命错误并停止脚本执行。
因此,require() 和 include() 之间没有区别,除了它们处理错误条件的方式不同。推荐使用 require() 函数代替 include(),因为如果文件缺失或名称错误,脚本不应继续执行。
语法
以下是 require 函数的语法 −
require 'filename.php';
这里,filename.php 是您想要 require 的文件。它可以是相对路径或绝对路径。
示例
您可以尝试使用上面的示例与 require() 函数,它会产生相同的结果。但如果您尝试以下两个示例,其中文件不存在,则会得到不同的结果。
<?php include("xxmenu.php"); ?>
<p>这是一个展示如何包含错误 PHP 文件的示例!</p>
输出
这将产生以下结果 −
This is an example to show how to include wrong PHP file!
现在让我们尝试使用 require() 函数的相同示例。
<?php <b>require("xxmenu.php");</b> ?>
<p>这是一个展示如何包含错误 PHP 文件的示例!</p>
这次文件执行会停止,什么都不会显示。
注意 − 您可能会收到普通的警告消息、致命错误消息,或者什么都没有。这取决于您的 PHP 服务器配置。
require() 方法的优势
在 PHP 中使用 require() 方法有很多优势 −
如果所需文件对页面很重要(例如,数据库连接文件),require() 会确保如果找不到该文件,脚本停止并显示错误,从而防止页面以有限功能加载。
该函数确保所有必要文件始终可用以正确执行。这对于网站正常运行所需的文件很有用。
像 include() 一样,require() 允许您在多个页面中重用代码。
使用 require(),您只需包含所需的代码一次,从而减少重复。
include() 和 require() 方法之间的区别
require 语句也用于在 PHP 代码中包含文件。然而,include 和 require 之间有一个重要的区别:如果使用 include 行包含文件但 PHP 找不到它,脚本会继续运行。
include() 函数在文件缺失时显示警告并继续执行。而 require() 方法在文件缺失时显示致命错误并停止执行。
include() 函数主要用于非关键文件,例如 header、footer。而 require() 用于重要文件,如数据库连接、配置。
include() 方法可以多次包含同一文件,除非使用 include_once()。而 require() 可以多次包含同一文件,除非使用 require_once()。
include() 即使文件不存在或缺失也会继续执行。而 require() 在文件缺失时停止脚本执行。
include_once() 和 require_once() 函数
这些函数在您需要确保文件只被包含一次时非常有用。
// config.php <?php $database_host = 'localhost'; ?> // settings.php <?php // 只包含一次 config.php include_once 'config.php'; // 即使多次调用也不会再次包含 require_once 'config.php'; echo "Database host is: $database_host"; ?>
文件包含的安全风险
虽然文件包含可以使你的代码更容易处理,但它也可能带来安全风险,特别是如果用户可以控制包含哪些文件。这被称为 Local File Inclusion (LFI),攻击者可以利用它。
易受攻击的代码示例
在这种情况下,恶意用户可以通过更改 page 查询参数来访问服务器上的任何文件,这可能导致数据泄露或其他漏洞。以下是一个你应该避免在 PHP 应用中使用示例代码 −
<?php // 用户可以设置 page 参数 $page = $_GET['page']; // 这可能导致危险的包含 include($page); ?>
防止文件包含漏洞
在使用 include 语句之前,始终检查并清理任何用户输入。
<?php
$allowed_pages = ['home.php', 'about.php', 'contact.php'];
if (in_array($page, $allowed_pages)) {
include($page);
} else {
echo "Page not found.";
}
?>
与其包含用户生成的内容的文件,你可以考虑使用预定义路径。如果你不需要远程文件包含,可以在你的 php.ini 文件中禁用它。
allow_url_include = Off