在 PHP 專案中,模組化開發離不開檔案引入。`require`、`include`、`require_once`、`include_once` 四個語句雖然功能相似,但行為差異極大,誤用易導致嚴重錯誤。本文深入解析其異同與適用場景。
| 特性 | require | include | require_once | include_once |
|---|---|---|---|---|
| 檔案不存在時 | 致命錯誤,腳本終止 | 警告,繼續執行 | 致命錯誤,腳本終止 | 警告,繼續執行 |
| 重複引入同一檔案 | 重複執行 | 重複執行 | 僅引入一次 | 僅引入一次 |
| 條件式引入 | 不支援(編譯期處理) | 支援(執行期處理) | 不支援 | 支援 |
| 迴圈中引入不同檔案 | 無效(僅第一次生效) | 有效 | 無效 | 有效 |
| 可使用 return 回傳值 | 否(PHP 4.0 後移除) | 是 | 否 | 是 |
<?php
// 錯誤:require 在迴圈中失效
$files = ['a.php', 'b.php', 'c.php'];
foreach ($files as $file) {
require $file; // 僅載入 a.php 三次!
}
// 正確:使用 include
foreach ($files as $file) {
include $file; // 依序載入 a.php、b.php、c.php
}
// 錯誤:條件式 require 仍會載入檔案
if ($debug) {
require 'debug_tools.php'; // 即使 $debug=false,檔案仍被引入!
}
// 正確:使用 include
if ($debug) {
include 'debug_tools.php'; // 僅在 $debug=true 時引入
}
?>
理解這些差異,能避免「重複定義函式/類別」、「變數污染」、「條件載入失效」等經典坑,寫出更健壯的 PHP 程式碼。