首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP include/require 四大差異詳解:代碼重用、範圍與效能最佳實踐

     編輯:PHP 相關知識

前言

PHP 提供四個檔案引入語句:include、include_once、require、require_once。它們在失敗處理、重複引入檢查、編譯時期/執行期行為上有關鍵差異。本文詳細對比並給出選擇指南與現代自動載入替代方案。

一、四大語句差異對照表

語句失敗後果重複引入處理階段典型用途
includeWarning,腳本繼續執行每次都引入執行期模板、可選配置、條件式引入
include_onceWarning,腳本繼續僅引入一次執行期函式庫、類別定義、防止重複定義錯誤
requireFatal Error,腳本終止每次都引入編譯期 (靜態)核心配置、必要依賴、啟動檔案
require_onceFatal Error,腳本終止僅引入一次編譯期 (靜態)類別/介面/Trait 定義、核心函式庫

二、關鍵行為深度解析

1. 編譯期 vs 執行期

  • require/require_once:編譯期處理,PHP 解析腳本時即展開檔案內容。無法在 if 判斷中動態決定路徑(路徑可用變數,但邏輯分支不影響是否編譯)。
  • include/include_once:執行期處理,執行到該行才引入。可用於條件式引入(如依語系載入不同語系檔)。

2. 變數作用域

引入檔案繼承呼叫處的變數作用域:

vars.php 內的程式碼視同寫在 include 該行位置。

3. 回傳值

 'value']; ?>

// 主程式
$result = include 'return.php'; // $result = ['config' => 'value']
$result = require 'return.php'; // 同上

若被引入檔無 return,成功引入回傳 1 (int)。

4. 遠端檔案引入 (已棄用/高風險)

三、選擇指南:何時用哪一個?

  1. 核心框架啟動檔、Composer autoload、資料庫連線配置 → require_once(必須載入、不可重複、缺失即終止)。
  2. 類別/介面/Trait 定義檔 → require_once(防止 "Cannot redeclare class" 錯誤)。
  3. 頁面模板、區塊片段、可選功能模組 → include(缺失不應中斷整頁、可條件式載入)。
  4. 函式庫、工具類 → include_once 或 require_once(視重要性)。

四、效能與現代替代方案

1. require_once 效能成本

  • 每次呼叫需檢查「已引入檔案清單」(內部陣列),大型專案數百次呼叫有微小開銷。
  • OPcache 啟用後,編譯結果快取,二次請求幾乎無差異。

2. PSR-4 自動載入 (Composer) - 現代標準

優勢:零手動引入、命名空間對應目錄結構、開發/生產環境一致、支援類別別名、最佳化載入順序。

3. spl_autoload_register() 自訂自動載入 (無 Composer 專案)

五、最佳實踐總結

  • 入口檔案只引入 vendor/autoload.php,其餘交給自動載入。
  • 避免在迴圈/函式中使用 require_once,若必要請改 include + 條件判斷。
  • 模板檔使用 include,讓模板能存取控制器傳入的區域變數。
  • 絕對路徑引入:require_once __DIR__ . '/config/database.php'; 避免相對路徑混淆。
  • 不要使用 @include 抑制錯誤,掩蓋問題難除錯。

六、總結

require_once 用於「不可缺少、不可重複」的核心依賴;include 用於「可選、條件式、模板」的靈活引入。現代 PHP 開發核心依賴交給 Composer PSR-4 自動載入,手動 include/require 僅保留於模板渲染與極少數動態載入場景。理解四者在錯誤等級、重複檢查、處理階段的差異,是寫出穩健 PHP 應用的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved