《PHP8上級試験対策》__serialize()と__unserialize()の動作を理解しよう

  • URLをコピーしました!

はじめに

オブジェクトをシリアライズ/アンシリアライズするとき、その「直列化」や「復元」に介入したいときがあります。

PHP8ではそのための新しいマジックメソッド__serialize()__unserialize() が導入されました。
この記事では、従来の __sleep()__wakeup() との違いと、実際の挙動をシンプルなコード例で理解していきます。

キーワード: __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() に記述する

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

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