萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 物件序列化與反序列化:serialize、unserialize、__sleep、__wakeup 完整指南

基本概念

  • 序列化:物件 → 二進位字串,可儲存檔案/資料庫/網路傳輸
  • 反序列化:字串 → 物件,需類別定義已載入

基本操作

class User {
    public $name, $age;
    public function __construct($name, $age) {
        $this->name = $name; $this->age = $age;
    }
    public function greet() { echo "Hi, I'm {$this->name}<br>"; }
}

$user = new User("張三", 25);
$serialized = serialize($user);
// 儲存檔案
file_put_contents('user.dat', $serialized);

// 反序列化 (需先載入類別定義)
require_once 'User.php';
$data = file_get_contents('user.dat');
$user2 = unserialize($data);
$user2->greet(); // Hi, I'm 張三

序列化格式範例

O:4:"User":2:{s:4:"name";s:6:"張三";s:3:"age";i:25;}
  • O:Object,4:類別名長度,"User":類別名
  • 2:屬性數量
  • s:4:"name":string 長度 4 鍵名
  • s:6:"張三":UTF-8 中文 6 位元組
  • i:25:integer 25

__sleep():控制序列化內容

class User {
    public $name, $age, $password, $dbConnection;
    
    public function __sleep() {
        // 只序列化這些屬性,排除敏感資料與資源
        return ['name', 'age']; 
    }
}
  • 必須回傳字串陣列(屬性名)
  • 回傳空陣列 = 不序列化任何屬性
  • 資源型別(資料庫連線、檔案控制代碼)**無法序列化**,必須排除

__wakeup():反序列化後初始化

class User {
    public $name, $age;
    private $db;
    
    public function __wakeup() {
        // 重新建立資料庫連線
        $this->db = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
        // 或從容器取得服務
    }
}

適用場景

  1. **快取物件**:Redis/Memcached 儲存序列化物件
  2. **Session 儲存**:PHP 預設序列化 Session 資料
  3. **跨程序傳遞**:訊息佇列、API 回應、CLI 傳參
  4. **持久化**:儲存到資料庫 blob 欄位

安全性警示 ⚠️

  • 絕對不要 unserialize 不可信資料:可能導致物件注入、RCE
  • PHP 7.0+ 可用 unserialize($data, ['allowed_classes' => ['User', 'Address']]) 限制允許類別
  • 資料傳輸建議用 JSON (json_encode/decode) 或 MessagePack
  • 簽名驗證:hash_hmac('sha256', $data, $secret) 防篡改

現代替代:JSON 序列化

class User implements JsonSerializable {
    public $name, $age, $password;
    
    public function jsonSerialize() {
        return ['name' => $this->name, 'age' => $this->age]; // 排除密碼
    }
}
$user = new User("張三", 25, "secret");
echo json_encode($user); // {"name":"張三","age":25}
copyright © 萬盛學電腦網 all rights reserved