《PHP8上級試験対策》serialize() / unserialize()でオブジェクトを保存・復元してみよう

  • URLをコピーしました!

はじめに

データを「一時的に保存したい」「通信で送受信したい」とき、オブジェクトや配列をそのまま扱うことはできません。そんなときに活躍するのが serialize()unserialize()
このペアを使えば、オブジェクトを文字列化して保存し、再び元の形に戻すことができます。

キーワード: serialize / unserialize / シリアライズ / オブジェクトの保存 / PHP8構文 / プロパティプロモーション

目次

🧩 シリアライズとは?

オブジェクトや配列を「保存・転送できる形式(=文字列)」に変換すること。それを「もとに戻す(デシリアライズ)」のが unserialize() です。

PHPでは以下のようにして扱います👇

<?php
declare(strict_types=1);
error_reporting(-1);

class Hoge {
    public function __construct(
        private int $num,
        private string $str,
    ) {}
}

// オブジェクト生成
$obj = new Hoge(1, '2nd');
var_dump($obj);

// シリアライズ
$s_str = serialize($obj);
var_dump($s_str);

// デシリアライズ
$obj2 = unserialize($s_str);
var_dump($obj2);

🧾 実行結果

object(Hoge)#1 (2) {
  ["num":"Hoge":private]=>
  int(1)
  ["str":"Hoge":private]=>
  string(3) "2nd"
}
string(61) "O:4:"Hoge":2:{s:9:"Hogenum";i:1;s:9:"Hogestr";s:3:"2nd";}"
object(Hoge)#2 (2) {
  ["num":"Hoge":private]=>
  int(1)
  ["str":"Hoge":private]=>
  string(3) "2nd"
}

🧠 ASCIIアートで見るシリアライズの流れ

┌────────────────-──┐
│  オブジェクト Hoge  │
│ num = 1           │
│ str = "2nd"       │
└──────┬────────────┘
       │ serialize()
       ▼
"文字列化されたデータ"
O:4:"Hoge":2:{s:9:"Hogenum";i:1;s:9:"Hogestr";s:3:"2nd";}
       │ unserialize()
       ▼
┌────────────────────┐
│  新しい Hoge #2     │
│ num = 1            │
│ str = "2nd"        │
└────────────────────┘

🧩 仕組みのポイント

  • serialize()privateプロパティを「クラス名付き」で格納します
    → 実際のデータ内部では「\0Hoge\0num」のような形式になります
  • unserialize()同じクラス名の構造をもとに再生成します
  • コンストラクタプロパティプロモーション構文でも正常に動作します

つまりこの結果は—— ✅ 完全に正しい挙動です。

🔧 さらに発展:独自シリアライズを定義したい場合

自前で制御したいときは __serialize() / __unserialize() を使います。

class Hoge {
    public function __construct(private int $num, private string $str) {}

    public function __serialize(): array {
        return ['num' => $this->num, 'str' => $this->str];
    }

    public function __unserialize(array $data): void {
        $this->num = $data['num'];
        $this->str = $data['str'];
    }
}

これでフォーマットや対象プロパティを自由に指定可能です。

🏁 まとめ

関数役割
serialize()オブジェクトを文字列化
unserialize()文字列からオブジェクトに戻す
__serialize() / __unserialize()カスタム定義が可能

🔹 シリアライズは、セッション保存・キャッシュ・ファイル永続化などでも使われる重要な仕組みです。
PHP内部の構造を理解すると、試験にも実務にも強くなります。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次