PHP 中的 require_once 与 include

Olorunfemi Akinlua 2023年1月30日 2022年7月12日
  1. 何时在 PHP 中使用 includerequire 关键字
  2. 何时在 PHP 中使用 require_onceinclude 关键字
PHP 中的 require_once 与 include

对于开发人员,在开发周期中,我们在开发或生产目录中分隔不同的 PHP 文件,但我们可能需要另一个 PHP 文件中的函数或类。在另一个文件中重复相同的类或函数是违反直觉的,并且违反 DRY 方法。

因此,PHP 有四个关键字来添加或访问另一个 PHP 文件的内容,includerequireinclude_oncerequire_once。在本文中,我们将考虑所有关键字,但我们将更多地关注 require_onceinclude

何时在 PHP 中使用 includerequire 关键字

关键字 includerequire 将所有内容、文本或代码或标记从指定的 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_onceinclude 关键字

有适当的区域可以使用 includerequire。建议一直使用 require;但是,如果你的应用程序可以在没有我们打算添加到当前 PHP 文件的 PHP 文件中的内容的情况下运行,则可能不会出现问题。

为了提供更多上下文来理解 includerequirerequire_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。

组合来理解。

  • requirerequire_once 将引发致命错误。
  • includeinclude_once 将引发致命错误。
  • require_oncerequire_once 可以正常工作,但所有内容将被召回和重新声明。
  • include_onceinclude_once 可以正常工作,但所有内容将被召回和重新声明。
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

相关文章 - PHP File