本文介紹一個極簡的 PHP Session 封裝類別 my_session,提供 set、get、del、destroy 四個核心方法,並自動處理 session.auto_start 衝突,適合快速整合至中小型專案。
class my_session {
function my_session() {
// 若 session.auto_start=On 已自動啟動,先銷毀避免衝突
if (session_id()) {
session_unset();
session_destroy();
}
session_start();
}
function set($name, $value) {
$_SESSION[$name] = $value;
}
function get($name) {
return isset($_SESSION[$name]) ? $_SESSION[$name] : false;
}
function del($name) {
unset($_SESSION[$name]);
}
function destroy() {
$_SESSION = array();
session_destroy();
}
}
session_id() 檢查是否已有 Session ID(代表 session.auto_start=On 或已手動啟動)。session_unset() 清空 $_SESSION、session_destroy() 刪除儲存檔案。session_start() 重新啟動乾淨的 Session。require_once 'my_session.class.php';
$sess = new my_session();
// 寫入
$sess->set('user_id', 12345);
$sess->set('username', 'john_doe');
$sess->set('permissions', ['read', 'write']);
// 讀取
$userId = $sess->get('user_id'); // 12345
$name = $sess->get('username'); // john_doe
$perm = $sess->get('permissions'); // ['read', 'write']
$missing = $sess->get('non_exist'); // false
// 刪除單一變數
$sess->del('permissions');
// 登出/銷毀整個 Session
$sess->destroy();
| 優點 | 缺點/改進建議 |
|---|---|
| 程式碼極簡,易理解、易維護 | 建構子名稱 my_session() 為 PHP 4 風格,現代應用 __construct() |
| 自動處理 session.auto_start 衝突 | 缺乏型別提示、嚴格模式支援 |
| 封裝核心 CRUD 操作,介面直觀 | 無命名空間,易衝突 |
| 無外部依賴,直接可用 | 錯誤處理簡單(get 回傳 false 而非拋出例外) |
| 未支援 Session ID 再生成、閒置超時、自訂儲存處理器等進階功能 |
namespace App\Session;
class SessionManager {
public function __construct(array $options = []) {
if (session_status() === PHP_SESSION_ACTIVE) {
return; // 已啟動
}
// 可選:設定 Session 參數
if (!empty($options['save_path'])) {
session_save_path($options['save_path']);
}
if (!empty($options['name'])) {
session_name($options['name']);
}
if (!empty($options['lifetime'])) {
session_set_cookie_params($options['lifetime']);
}
// 處理 auto_start 衝突
if (session_id()) {
session_unset();
session_destroy();
}
session_start();
// 可選:嚴格模式、安全 Cookie
ini_set('session.use_strict_mode', '1');
ini_set('session.cookie_httponly', '1');
ini_set('session.cookie_secure', isset($_SERVER['HTTPS']) ? '1' : '0');
}
public function set(string $name, $value): void {
$_SESSION[$name] = $value;
}
public function get(string $name, $default = null) {
return $_SESSION[$name] ?? $default;
}
public function has(string $name): bool {
return isset($_SESSION[$name]);
}
public function delete(string $name): void {
unset($_SESSION[$name]);
}
public function regenerateId(bool $deleteOld = true): void {
session_regenerate_id($deleteOld);
}
public function destroy(): void {
$_SESSION = [];
session_destroy();
}
public function getId(): string {
return session_id();
}
}
my_session 展示了 Session 封裝的核心思想:統一入口、簡化 API、處理邊界情況。實務專案建議採用現代化重構版本,加入命名空間、型別提示、依賴注入、PSR-6/PSR-16 快取介面整合、自訂儲存處理器等企業級特性,構建可測試、可擴充、符合現代 PHP 標準的 Session 管理元件。