PHP 中的 require_once 与 include
对于开发人员,在开发周期中,我们在开发或生产目录中分隔不同的 PHP 文件,但我们可能需要另一个 PHP 文件中的函数或类。在另一个文件中重复相同的类或函数是违反直觉的,并且违反 DRY 方法。
因此,PHP 有四个关键字来添加或访问另一个 PHP 文件的内容,include
、require
、include_once
和 require_once
。在本文中,我们将考虑所有关键字,但我们将更多地关注 require_once
和 include
。
何时在 PHP 中使用 include
与 require
关键字
关键字 include
和 require
将所有内容、文本或代码或标记从指定的 PHP 文件复制到包含语句的目标 PHP 文件中。然而,include
关键字在处理失败时的行为与 require
不同。
-
require
产生 fatal error (E_COMPILE ERROR
) 并停止脚本。 -
include
只产生一个 warning (E_WARNING
),即使下一部分需要你包含的 PHP 文件中的代码,脚本也会继续。
如果没有发生错误,则两个关键字的方式相同。
让我们尝试添加一个简单的 PHP 文件(variables.php
),其中包含几个变量到我们当前的 PHP 文件中。
variables.php
文件:
<?php
$team = 'Golden State Warriors';
$fav_player = 'Steph Curry';
?>
现在,让我们使用 include
关键字来添加 variables.php
的内容:
<?php
echo "My favourite player is $fav_player and he plays for $team";
include 'variables.php';
echo "My favourite player is $fav_player and he plays for $team";
?>
上述代码片段的输出:
My favourite player is and he plays for
My favourite player is Steph Curry and he plays for Golden State Warriors
如你所见,第一行没有输出变量的内容,因为我们没有包含 variables.php
文件,但是一旦我们添加它,它就有了变量的内容。
现在,让我们使用 require
关键字:
<?php
echo "My favourite player is $fav_player and he plays for $team";
include 'variables.php';
echo "My favourite player is $fav_player and he plays for $team";
?>
输出:
My favourite player is and he plays for
My favourite player is Steph Curry and he plays for Golden State Warriors
产生了相同的输出。现在,让我们在代码中拼错 variables.php
文件,看看效果。
对于 include
关键字:
My favourite player is and he plays for
Warning: include(variable.php): failed to open stream: No such file or directory in /home/runner/Jinku/index.php on line 5
Warning: include(): Failed opening 'variable.php' for inclusion (include_path='.:/nix/store/bq7pj5lz7rq92p3d3qyy25lpzic9phy5-php-7.4.21/lib/php') in /home/runner/Jinku/index.php on line 5
My favourite player is and he plays for
对于 require
关键字:
My favourite player is and he plays for
Warning: require(variable.php): failed to open stream: No such file or directory in /home/runner/Jinku/index.php on line 5
Fatal error: require(): Failed opening required 'variable.php' (include_path='.:/nix/store/bq7pj5lz7rq92p3d3qyy25lpzic9phy5-php-7.4.21/lib/php') in /home/runner/Jinku/index.php on line 5
你现在可以看到两者之间的区别。使用 include
关键字,即使包含的文件不存在并且只给出警告,代码也会继续执行。
但是,使用 require
关键字时,代码会产生致命错误并在此时完全停止。
何时在 PHP 中使用 require_once
与 include
关键字
有适当的区域可以使用 include
或 require
。建议一直使用 require
;但是,如果你的应用程序可以在没有我们打算添加到当前 PHP 文件的 PHP 文件中的内容的情况下运行,则可能不会出现问题。
为了提供更多上下文来理解 include
、require
和 require_once
关键字,让我们尝试一个示例。对于这个例子,我们将创建一个 functions.php
文件,该文件将被包含在内并需要展示差异。
functions.php
文件:
<?php
function add_sums($a, $b) {
return $a + $b;
}
?>
让我们使用 include
:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php
include 'functions.php';
echo "The program is starting\n";
$sum = add_sums(2,3);
echo "The program is done\n";
echo $sum;
?>
</body>
</html>
代码片段的输出:
The program is done 5
让我们使用 require
:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php
require 'functions.php';
echo "The program is starting\n";
$sum = add_sums(2,3);
echo "The program is done\n";
echo $sum;
?>
</body>
</html>
代码片段的输出:
The program is done 5
但是,如果 functions.php
文件不可用,而我们使用 include
,则输出如下:
Warning: include(functions.php): failed to open stream: No such file or directory in /home/runner/Jinku/index.php on line 7
Warning: include(): Failed opening 'functions.php' for inclusion (include_path='.:/nix/store/bq7pj5lz7rq92p3d3qyy25lpzic9phy5-php-7.4.21/lib/php') in /home/runner/Jinku/index.php on line 7
The program is starting
Fatal error: Uncaught Error: Call to undefined function add_sums() in /home/runner/Jinku/index.php:9 Stack trace: #0 {main} thrown in /home/runner/Jinku/index.php on line 9
尽管 functions.php
不存在,但代码仍在运行,直到由于调用未定义的函数而发生致命错误,这不是在 PHP 应用程序中工作的有效方法。
但是,当我们使用 require
时,错误如下所示:
Warning: require(functions.php): failed to open stream: No such file or directory in /home/runner/Jinku/index.php on line 7
Fatal error: require(): Failed opening required 'functions.php' (include_path='.:/nix/store/bq7pj5lz7rq92p3d3qyy25lpzic9phy5-php-7.4.21/lib/php') in /home/runner/Jinku/index.php on line 7
因为我们使用了 require
关键字,我们可以防止由于调用未定义函数而导致的致命错误。对于相当复杂的 PHP 应用程序,require
将更适合能够快速捕获错误并防止不必要的后果。
现在,让我们更进一步。让我们使用 require_once
关键字:
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php
// Previous code START
require_once 'functions.php';
echo "The program is starting\n";
$sum = add_sums(2,3);
echo "The program is done\n";
echo $sum;
// Previous code ENDS
// Additional code STARTS
echo "Another program begins";
require 'functions.php';
$sum = add_sums(2,3);
echo $sum;
echo "Another program ends";
?>
</body>
</html>
上述代码片段的输出会产生一个致命错误:
The program is starting
The program is done
5
Another program begins
Fatal error: Cannot redeclare add_sums() (previously declared in /home/runner/Jinku/functions.php:3) in /home/runner/Jinku/functions.php on line 3
require_once
关键字将检查文件是否已被包含,如果是,则不再包含或要求它。因此,因为我们之前使用了 require_once
关键字,它可以防止要求甚至包含 functions.php
中的代码。
你可能希望这样做以防止重新声明函数调用或变量值分配,这对你的代码来说可能代价高昂。
在示例中,如果我们使用 require
两次,它将再次调用该函数并产生与之前相同的效果,结果为 5。
组合来理解。
-
require
和require_once
将引发致命错误。 -
include
和include_once
将引发致命错误。 -
require_once
和require_once
可以正常工作,但所有内容将被召回和重新声明。 -
include_once
和include_once
可以正常工作,但所有内容将被召回和重新声明。
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组