當專案規模增長,網頁數量達到數百甚至上千時,重複的程式碼區塊(如頁首、頁尾、版權宣告、資料庫連線設定、常用函式庫)若分散在每個檔案中,維護將成為噩夢。修改一行版權文字,可能要編輯上百個檔案。PHP 提供了四個核心函式來解決這個問題:include()、include_once()、require()、require_once()。
| 函式 | 執行階段 | 失敗處理 | 重複引入檢查 | 典型適用場景 |
|---|---|---|---|---|
include() |
執行期 | 發出 Warning,腳本繼續執行 | 否 | 動態內容、條件式引入、模板片段 |
include_once() |
執行期 | 發出 Warning,腳本繼續執行 | 是 | 函式庫、類別定義、防止重複宣告錯誤 |
require() |
編譯期 | 發出 Fatal Error,腳本立即終止 | 否 | 核心設定檔、關鍵依賴、靜態版面結構 |
require_once() |
編譯期 | 發出 Fatal Error,腳本立即終止 | 是 | 核心函式庫、類別檔案、確保只載入一次 |
版權資訊不含變數,屬於靜態內容,且若遺失會嚴重影響頁面完整性,適合用 require() 在編譯階段直接插入。
<!DOCTYPE html>
<html>
<head><title>我的網站</title></head>
<body>
<main>...頁面主要內容...</main>
<footer>
<?php require __DIR__ . '/includes/copyright.php'; ?>
</footer>
</body>
</html>
確保核心工具類別在整個請求生命週期中只被載入一次,避免「Cannot redeclare class」錯誤。
<?php
require_once __DIR__ . '/lib/Database.php';
require_once __DIR__ . '/lib/Util.php';
$db = new Database();
$util = new Util();
// ... 後續業務邏輯
?>
根據條件動態決定載入哪個模板檔案,執行期才解析,彈性最高。
<?php
$template = $_GET['view'] ?? 'default';
$allowed = ['default', 'mobile', 'amp'];
if (in_array($template, $allowed)) {
include "templates/{$template}.php";
} else {
include "templates/404.php";
}
?>
引入檔案常包含資料庫帳密、API 金鑰等機密資訊。絕對不要將這些檔案放在 Web 公開目錄下(如 public_html/、www/、htdocs/)。
最佳實踐:
config.php、db_connect.php 等敏感檔案放在 Web 根目錄之外(例如專案根目錄的 config/ 或 includes/)。php.ini 設定 open_basedir 限制腳本存取路徑。.htaccess 禁止直接存取 *.inc、*.php 等副檔名的引入檔。早期需手寫大量
require_once。現代 PHP (PHP 5.3+ 配合 PSR-4 標準) 採用 Composer 自動載入:// composer.json 設定自動載入規則後,僅需在入口檔引入一次: require_once __DIR__ . '/vendor/autoload.php'; // 之後直接使用命名空間類別,無需手動 require use App\Service\UserService; $userService = new UserService();這才是目前企業級專案的標準作法,徹底解決了檔案引入管理的痛點。
掌握 include/require 家族的差異,能讓您撰寫出結構清晰、易於維護的 PHP 專案。記住核心原則:關鍵靜態依賴用 require,動態彈性內容用 include,類別/函式庫必加 _once,敏感檔案放公開目錄外。下一篇將介紹 GD 圖形處理技巧,敬請期待。