善用 include()/require() 將配置、初始化與共用路徑集中管理,能大幅減少重複代碼、簡化部署遷移,是 PHP 專案結構化的基石。本文提出「雙層包含檔」架構模式。
require_once('app-top.php')。<?php
// config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'app_user');
define('DB_PASS', 'secret');
define('DB_NAME', 'myapp');
define('TABLE_PREFIX', 'app_'); // 資料表前綴,防衝突
define('SERVER_URL', 'https://localhost'); // 開發機
define('APP_FOLDER', '/myapp/'); // 子目錄,正式機改為 '/'
// 衍生常數(不直接使用,供 app-top.php 參考)
?>
<?php
// app-top.php
ob_start('ob_gzhandler'); // 輸出緩衝 + GZIP
session_start();
error_reporting(E_ALL);
require_once('config.php');
// 衍生常數:所有路徑/URL 統一在此定義
define('APP_URL', SERVER_URL . APP_FOLDER);
define('SERVER_DOC_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('APP_DIR', SERVER_DOC_ROOT . APP_FOLDER);
define('INCLUDES_DIR', APP_DIR . 'includes/');
define('LIB_DIR', APP_DIR . 'lib/');
define('UPLOADS_DIR', APP_DIR . 'uploads/');
define('UPLOADS_URL', APP_URL . 'uploads/');
// 資料庫連線
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (!$link) {
exit("資料庫連線失敗: " . mysqli_connect_error());
}
mysqli_set_charset($link, 'utf8mb4');
?>
<?php
// 任何業務頁面
require_once('app-top.php'); // 僅需這一行
// 使用衍生常數引入其他檔案
require_once(INCLUDES_DIR . 'header.php');
require_once(LIB_DIR . 'UserService.php');
$userSvc = new UserService($link);
$users = $userSvc->getAll();
?>
<html>...</html>
| 檔案 | 職責 | 修改頻率 | 部署差異 |
|---|---|---|---|
| config.php | 敏感配置(DB帳密、URL根路徑) | 低 | 各環境不同,需手動調整 |
| app-top.php | 初始化邏輯、衍生常數、共用服務 | 中 | 程式碼層面,版控同步即可 |