首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 處理類 my_session 簡易封裝教學

     編輯:PHP 相關知識

前言

本文介紹一個極簡的 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 再生成、閒置超時、自訂儲存處理器等進階功能

現代化重構範例(PHP 7.4+)

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 管理元件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved