はじめに
データを「一時的に保存したい」「通信で送受信したい」とき、オブジェクトや配列をそのまま扱うことはできません。そんなときに活躍するのが serialize()
と unserialize()
。
このペアを使えば、オブジェクトを文字列化して保存し、再び元の形に戻すことができます。
目次
🧩 シリアライズとは?
オブジェクトや配列を「保存・転送できる形式(=文字列)」に変換すること。それを「もとに戻す(デシリアライズ)」のが 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内部の構造を理解すると、試験にも実務にも強くなります。