はじめに
オブジェクトをシリアライズ/アンシリアライズするとき、その「直列化」や「復元」に介入したいときがあります。
PHP8ではそのための新しいマジックメソッド__serialize()
と __unserialize()
が導入されました。
この記事では、従来の __sleep()
/__wakeup()
との違いと、実際の挙動をシンプルなコード例で理解していきます。
目次
🧩 シリアライズとアンシリアライズとは?
オブジェクトを「ファイルや文字列に変換」して保存・転送することをシリアライズ(serialize) と呼びます。
そして、保存した文字列を再びオブジェクトに戻す処理をアンシリアライズ(unserialize) と呼びます。
$objectString = serialize($obj);
$newObj = unserialize($objectString);
🧠 マジックメソッドで“介入”する
PHPでは、これらのタイミングに介入できるマジックメソッドが4つあります。
タイミング | メソッド名 | 対応バージョン | 戻り値 | 説明 |
---|---|---|---|---|
シリアライズ時 | __sleep() | PHP7以前〜 | array | シリアライズするプロパティ名を返す |
アンシリアライズ時 | __wakeup() | PHP7以前〜 | void | 復元後の初期化処理を行う |
シリアライズ時 | __serialize() | PHP7.4〜 | array | 保存したいデータを配列で返す |
アンシリアライズ時 | __unserialize() | PHP7.4〜 | void | 配列データをもとに復元処理を行う |
PHP8では __serialize()
/__unserialize()
の使用が推奨 です。
💻 サンプルコードで理解する
<?php
declare(strict_types=1);
error_reporting(-1);
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 {
foreach($data as $k => $v){
$this->$k = $v;
}
$this->str .= ' add';
}
}
$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(49) "O:4:"Hoge":2:{s:3:"num";i:1;s:3:"str";s:3:"2nd";}"
object(Hoge)#2 (2) {
["num":"Hoge":private]=>
int(1)
["str":"Hoge":private]=>
string(7) "2nd add"
}
✅ つまり、__serialize()
で定義した配列データがシリアライズ文字列に変換され、__unserialize()
内で "2nd add"
に加工されて復元されています。
🧮 ASCIIアートで見るデータの流れ
┌─────────────────────┐
│ new Hoge(1,"2nd") │
└─────┬───────────────┘
│
▼
┌───────────────────┐
│ serialize($obj) │
│ ↓ 呼ばれる │
│ __serialize() │
│ ⇒ ['num'=>1, 'str'=>'2nd'] │
└───────────────────┘
│
▼
"文字列化データ"(保存や送信が可能)
│
▼
┌───────────────────┐
│ unserialize($s) │
│ ↓ 呼ばれる │
│ __unserialize() │
│ ⇒ str .= ' add' │
└───────────────────┘
│
▼
復元オブジェクト
num=1 / str="2nd add"
📘 まとめ
処理 | マジックメソッド | 説明 |
---|---|---|
シリアライズ | __serialize() | 保存データを配列で返す |
アンシリアライズ | __unserialize() | 復元後の初期化や加工を行う |
結果 | "2nd add" が出力 | ✅ 正常動作・正解! |
✅ 試験対策ポイント
- PHP8では
__serialize()
/__unserialize()
が主流 __sleep()
/__wakeup()
は後方互換目的- 復元後にプロパティを加工・初期化したいときは
→__unserialize()
に記述する