PHP 中的 require_once 與 include

Olorunfemi Akinlua 2023年1月30日
  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