四大引入函式對照
| 函式 | 執行時機 | 失敗處理 | 重複引入 | 典型用途 |
include() | 執行期 | 警告 (E_WARNING) 繼續執行 | 每次都引入 | 動態內容、模板、條件載入 |
include_once() | 執行期 | 警告 | 僅第一次引入 | 函式庫、類別定義、防重複 |
require() | 編譯期 | 致命錯誤 (E_COMPILE_ERROR) 停止 | 每次都引入 | 核心設定、必要相依、靜態內容 |
require_once() | 編譯期 | 致命錯誤 | 僅第一次引入 | 類別/介面定義、設定檔、防重複 |
變數範圍與路徑解析
- 引入檔案在 呼叫處的變數範圍內 執行,可存取區域變數。
- 路徑可為絕對、相對 (相對當前工作目錄)、或
include_path 內路徑。
- 支援 URL 包裝器 (
allow_url_fopen=On):include('https://example.com/file.php'),但極度不建議 (安全風險、效能差、無法取得回傳值)。
最佳實踐模式
1. 靜態版權/頁尾 - require
<html><body>
... 內容 ...
<?php require(__DIR__ . '/includes/copyright.php'); ?>
</body></html>
2. 函式庫/類別 - require_once
<?php
require_once __DIR__ . '/lib/Database.php';
require_once __DIR__ . '/lib/Functions.php';
// 後續使用類別/函式
?>
3. 動態模板片段 - include
<?php
$template = 'templates/' . $page . '.php';
if (file_exists($template)) include $template;
else include 'templates/404.php';
?>
安全與效能建議
- 絕對路徑:使用
__DIR__ 或 __FILE__ 避免工作目錄變更導致路徑錯誤。
- 自動載入:現代專案採用 Composer PSR-4
spl_autoload_register,完全取代手動 require_once。
- 敏感檔案防存取:設定檔、資料庫憑證放在
DocumentRoot 外部,或用 .htaccess 禁止直接存取。
- Opcode 快取:啟用 OPcache,編譯後的 bytecode 共享記憶體,消除重複編譯開銷。
- 避免迴圈引入:A include B, B include A 會導致死循環/重複定義錯誤。
現代框架對比
| 框架 | 載入機制 | 特點 |
| Laravel | Composer Autoload + Service Container | 自動發現、依賴注入、Facades |
| Symfony | Composer Autoload + DependencyInjection | 編譯容器、嚴格解耦 |
| CodeIgniter 4 | Composer Autoload + Auto-loader | 輕量、命名空間對應目錄 |
| Yii 2 | Composer Autoload + Class Map | 高效能類別映射表 |
結語
include/require 是 PHP 代碼重用的基石。理解四者差異、變數範圍、路徑解析、編譯與執行期區別,能寫出可維護、安全、高效能的模組化代碼。現代開發請擁抱 Composer 自動載入與依賴注入,將「引入檔案」轉化為「聲明依賴」,專注於業務邏輯而非檔案管理。