大量初學者認為:form → page1.php → page2.php 中,page1.php 接收的 $start 會自動出現在 page2.php。錯誤! HTTP 無狀態,每次請求獨立,除非顯式傳遞(隱藏字段、URL 參數、Session、Cookie、Token),數據不會跨請求生存。
| 類型 | 生命週期 | 作用域 | 典型用途 |
|---|---|---|---|
| 超全局變量 ($_GET, $_POST, $_REQUEST) | 單次請求 | 全局 | 接收輸入 |
| 局部變量 (函數內) | 函數執行期間 | 函數內部 | 邏輯計算 |
| 全局變量 (global $x / $GLOBALS) | 單次請求 | 全局 (需聲明) | 舊代碼兼容 |
| 靜態變量 (static $x) | 腳本運行期間 (進程級) | 函數內部 | 緩存、計數器 |
| Session 變量 ($_SESSION) | 會話存活期 (默認 24min GC) | 同用戶會話跨請求 | 用戶狀態、權限、購物車 |
| Cookie | 過期時間 (客戶端控制) | 同域跨請求、跨會話 | 記住我、偏好設置、追蹤 |
| APCu / Redis / Memcached | 配置 TTL / 手動清理 | 進程/集群跨請求 | 高性能緩存、分佈式鎖、限流 |
| JWT (JSON Web Token) | Token 過期時間 (自包含) | 無狀態、跨服務、跨域 | API 認證、單點登入、微服務 |
// page1.php
header("Location: page2.php?start=" . urlencode($start));
exit;
// page2.php
$start = $_GET['start'] ?? '';
// 簽發
$payload = [
'sub' => $userId,
'wizard' => ['start' => $start, 'step' => 1],
'iat' => time(),
'exp' => time() + 1800,
];
$token = JWT::encode($payload, $secretKey, 'HS256');
setcookie('wizard_token', $token, ['httponly' => true, 'secure' => true, 'samesite' => 'lax']);
// 驗證 (中間件)
$token = $_COOKIE['wizard_token'] ?? '';
try {
$payload = JWT::decode($token, new Key($secretKey, 'HS256'));
$start = $payload->wizard->start ?? '';
} catch (Exception $e) {
// Token 過期/篡改/無效
}
| 場景 | 首選方案 | 備選 | 禁忌 |
|---|---|---|---|
| 用戶登錄狀態 | Session (Redis) | JWT (API) | Cookie 存密碼/權限 |
| 多步驟表單 (敏感) | Session | 隱藏字段 + 簽名 | URL 參數 |
| 多步驟表單 (非敏感) | 隱藏字段 | Session | - |
| 分頁/排序/過濾 | URL 參數 | - | Session |
| API 認證 | JWT / OAuth2 Access Token | - | Session Cookie |
| 單點登入 (SSO) | JWT / SAML / OIDC | - | Session |
| 記住我 (長期) | 加密 Cookie (獨立 Token) | - | Session (生命週期短) |
| 高性能緩存 (非用戶狀態) | Redis / APCu | - | Session |
HttpOnly (防 XSS 竊取)、Secure (僅 HTTPS)、SameSite=Lax/Strict (防 CSRF)。session_regenerate_id(true),session.use_strict_mode=1。htmlspecialchars(),JS json_encode(),URL urlencode(),SQL 參數化查詢。PHP 變量默認「請求級」生命週期,跨頁傳遞本質是狀態管理。從 URL 參數、隱藏字段、Session 到 JWT,每種方案都是在安全性、擴展性、體驗、複雜度四維空間中的不同權衡。沒有萬能方案,只有場景最優解:敏感業務上 Session (Redis),無狀態 API 上 JWT,簡單導航用 URL 參數,表單向導用隱藏字段或 Session。理解本質,拒絕盲目複製貼上,才能構建安全可靠的 Web 應用。