封裝原生 $_SESSION 操作,提供:
<?php
class Session {
private static $sessionObject;
private function __construct() {
// 僅當用戶狀態非 0 時設置 cookie 生命週期
if (!isset($_SESSION['user']) || $_SESSION['user'] !== 0) {
session_set_cookie_params(3600); // 1小時
}
session_start();
}
private function __clone() {} // 禁止克隆
public static function getObject(): self {
if (!self::$sessionObject instanceof self) {
self::$sessionObject = new self();
}
return self::$sessionObject;
}
public function setFalse(): void {
$_SESSION['user'] = 0; // 標記無效
}
public function setTrue(): void {
if (isset($_SESSION['user'])) {
$_SESSION['user'] = 1; // 標記有效
} else {
$this->error();
}
}
public function getStatus(): int {
return $_SESSION['user'] ?? 0;
}
public function endSession(): void {
session_destroy();
}
private function error(): void {
// 可擴展:記錄日誌、拋出異常等
}
}
$session = Session::getObject();
// 驗證用戶名密碼通過後
if ($row['password'] === $inputPassword) {
$session->setTrue();
}
$session = Session::getObject();
if ($session->getStatus() === 1) {
// 用戶已登錄,顯示內容
} else {
// 重定向到登錄頁
header('Location: login.php');
exit;
}
$session = Session::getObject();
$session->endSession();
header('Location: index.php');
| 機制 | 實現方式 | 作用 |
|---|---|---|
| 單例模式 | 私有構造函數 + 靜態 getObject() | 避免重複 session_start(),節省資源 |
| Cookie 生命週期 | session_set_cookie_params(3600) | 瀏覽器關閉後 1 小時內免登錄 |
| 狀態值設計 | 0=無效/未登錄,1=有效 | 明確語義,避免 null/false 歧義 |
| 延遲啟動 | 構造函數中才 session_start() | 僅在真正需要時啟動會話 |
session_regenerate_id(true)session_set_cookie_params(3600, '/', '', true, true)(Secure + HttpOnly)$_SESSION['user_id'] 存儲具體用戶 ID,而非僅用 0/1$_SESSION['last_activity'] 實現服務端閒置銷毀當前類僅管理布爾登錄狀態,實際項目建議擴展為:
class Session {
// ...
public function setUser(array $userData): void {
$_SESSION['user'] = 1;
$_SESSION['user_data'] = $userData; // id, name, roles, permissions...
}
public function getUser(): ?array {
return $this->getStatus() ? ($_SESSION['user_data'] ?? null) : null;
}
public function hasRole(string $role): bool {
$user = $this->getUser();
return $user && in_array($role, $user['roles'] ?? []);
}
}