【PHP8.x】RequestParseBodyException::__wakeup()メソッドの使い方
__wakeupメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__wakeupメソッドは、PHPでシリアライズされた(直列化された)オブジェクトがデシリアライズ(復元)される際に、自動的に実行される特殊なメソッド(マジックメソッド)です。このメソッドは、オブジェクトが元の状態に復元された直後に、必要な初期化処理やリソースの再接続といった後処理を実行するために利用されます。例えば、ファイルハンドルやデータベース接続のように、オブジェクトをシリアライズする際に保存できないリソースを、オブジェクトが復元された後に再度確立する場合などに使用されます。
この__wakeupメソッドは、PHPの内部で定義されているRequestParseBodyExceptionクラスに所属しています。RequestParseBodyExceptionは、HTTPリクエストのボディ部分を解析する際にエラーが発生した場合にスローされる例外クラスです。通常、例外オブジェクトをシリアライズしてデシリアライズする機会はあまりありませんが、PHPの内部処理において、特定の状況下でオブジェクトの状態を復元する必要がある場合にこのメソッドが役割を果たす可能性があります。
ただし、PHP 8のバージョンでは、__wakeupマジックメソッドの定義は、Serializableインターフェースを実装しているクラスを除いて非推奨(deprecated)となっています。これは、今後のPHPのバージョンで__wakeupメソッドが削除される可能性を示唆しています。そのため、新しいアプリケーション開発においては、__wakeupメソッドに依存しない設計を検討することが推奨されます。既存のコードで__wakeupメソッドを使用している場合は、その代替となる__unserialize()メソッドや他の設計パターンへの移行を考慮する必要があります。
構文(syntax)
1class RequestParseBodyException extends Exception 2{ 3 public function __wakeup(): void 4 { 5 // オブジェクトがデシリアライズされて再構築された際に実行される処理を記述します。 6 } 7}
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP __wakeup マジックメソッドでオブジェクトを復元する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * __wakeup マジックメソッドの動作を示すサンプルクラス。 7 * 8 * このクラスは、シリアライズ(オブジェクトを文字列に変換)され、 9 * その後アンシリアライズ(文字列からオブジェクトに復元)されることを想定しています。 10 */ 11class Connection 12{ 13 /** @var string 接続先情報 */ 14 private string $dsn; 15 16 /** @var ?string 接続状態を示すプロパティ */ 17 private ?string $status = null; 18 19 public function __construct(string $dsn) 20 { 21 $this->dsn = $dsn; 22 $this->connect(); 23 } 24 25 /** 26 * オブジェクトが unserialize() によって復元される際に自動的に呼び出されるマジックメソッド。 27 * 28 * データベース接続の再確立など、オブジェクトが復元された際の 29 * 初期化処理をここで行います。 30 */ 31 public function __wakeup(): void 32 { 33 echo "__wakeup() メソッドが呼び出されました。\n"; 34 // シリアライズされたオブジェクトが復元された後、再度接続処理を実行します。 35 $this->connect(); 36 } 37 38 /** 39 * 接続を模倣するメソッド 40 */ 41 public function connect(): void 42 { 43 $this->status = "Connected to {$this->dsn}"; 44 echo "接続処理が実行されました。\n"; 45 } 46 47 /** 48 * 現在の接続状態を返すメソッド 49 */ 50 public function getStatus(): ?string 51 { 52 return $this->status; 53 } 54} 55 56// 1. オブジェクトをインスタンス化します。__construct() が呼ばれます。 57echo "--- 1. オブジェクトの生成 ---\n"; 58$connection = new Connection('mysql:host=localhost'); 59echo "生成後の状態: " . $connection->getStatus() . "\n\n"; 60 61// 2. オブジェクトをシリアライズ(文字列に変換)します。 62// これにより、オブジェクトの状態をファイルやセッションに保存できます。 63echo "--- 2. オブジェクトのシリアライズ ---\n"; 64$serializedData = serialize($connection); 65echo "シリアライズされたデータ: {$serializedData}\n\n"; 66 67// 元のオブジェクトを破棄したと仮定します。 68unset($connection); 69 70// 3. シリアライズされた文字列からオブジェクトを復元します。 71// この unserialize() の過程で、__wakeup() メソッドが自動的に実行されます。 72echo "--- 3. オブジェクトのアンシリアライズ ---\n"; 73$restoredConnection = unserialize($serializedData); 74 75// 4. __wakeup() によって再初期化されたオブジェクトの状態を確認します。 76echo "\n--- 4. 復元後のオブジェクトの状態確認 ---\n"; 77echo "復元後の状態: " . $restoredConnection->getStatus() . "\n"; 78 79?>
PHPの__wakeupメソッドは、オブジェクトがシリアライズ(オブジェクトの状態を文字列などに変換して保存)され、その後unserialize()関数によって復元される際に自動的に呼び出されるマジックメソッドです。このメソッドは、引数を受け取らず、戻り値もありません。主な目的は、オブジェクトが復元された直後に必要な初期化処理を実行することです。例えば、シリアライズ中に切断されたデータベース接続やファイルハンドルなどの外部リソースを再確立する際に利用されます。
サンプルコードでは、Connectionクラスが__wakeupメソッドを実装しています。まず、Connectionオブジェクトが生成され、接続処理が実行されます。次に、このオブジェクトがシリアライズされ、一度破棄されます。その後、シリアライズされたデータからオブジェクトをunserialize()で復元すると、自動的に__wakeup()メソッドが呼び出され、再度接続処理が実行される様子が確認できます。これにより、復元されたオブジェクトは、外部リソースへの接続が確立された状態で利用可能になります。
__wakeupメソッドは、unserialize()関数によってシリアライズされたオブジェクトが復元される際に自動的に呼び出される特殊なメソッドです。これはオブジェクト生成時に実行される__constructとは異なり、復元後のデータベース接続の再確立など、オブジェクトの内部状態を再初期化する目的で利用されます。
特に注意が必要なのはセキュリティ面で、信頼できない外部からの入力に対してunserialize()を使用すると、予期せぬコード実行などの深刻な脆弱性につながる可能性があります。安全のため、信頼できるデータのみで利用するようにしてください。また、PHP 8.1以降では、__sleepと__wakeupの代替として__serializeや__unserializeの使用が推奨されており、より柔軟なシリアライズ制御が可能です。
PHP __wakeup マジックメソッドのバイパス
1<?php 2 3/** 4 * __wakeup マジックメソッドの動作と、特定の不正なシリアライズデータによる 5 * __wakeup の「バイパス」の可能性を示すクラス。 6 * 7 * RequestParseBodyException は PHP の内部クラスであり、ユーザーランドで直接 8 * シリアライズ・デシリアライズすることは想定されていません。 9 * このコードは、一般的なユーザー定義クラスにおける __wakeup の動作と 10 * 不正なシリアライズデータがどのように __wakeup の呼び出しを「バイパス」 11 * する(つまり、呼び出されないようにする)かを説明するためのものです。 12 */ 13class MyWakableClass 14{ 15 public string $data; 16 public bool $wakeupCalled = false; 17 18 public function __construct(string $data) 19 { 20 $this->data = $data; 21 echo "コンストラクタが呼び出されました: " . $this->data . PHP_EOL; 22 } 23 24 /** 25 * オブジェクトが unserialize() によって再構築された後に呼び出されるマジックメソッドです。 26 * オブジェクトの初期化処理などを行うために使用されます。 27 */ 28 public function __wakeup(): void 29 { 30 $this->wakeupCalled = true; 31 echo "__wakeup が呼び出されました。データ: " . $this->data . PHP_EOL; 32 } 33} 34 35// --- 通常のシリアライズとデシリアライズの例 --- 36echo "--- 通常のシリアライズとデシリアライズ ---" . PHP_EOL; 37$originalObject = new MyWakableClass("正常なデータ"); 38 39// オブジェクトをシリアライズ(文字列に変換) 40$serializedString = serialize($originalObject); 41echo "シリアライズされた文字列: " . $serializedString . PHP_EOL; 42 43// シリアライズされた文字列からオブジェクトをデシリアライズ(再構築) 44// このとき、MyWakableClass の __wakeup メソッドが呼び出されます。 45$unserializedNormal = unserialize($serializedString); 46 47if ($unserializedNormal instanceof MyWakableClass) { 48 echo "デシリアライズされたオブジェクトのデータ: " . $unserializedNormal->data . PHP_EOL; 49 echo "__wakeup は呼び出されましたか? " . ($unserializedNormal->wakeupCalled ? "はい" : "いいえ") . PHP_EOL; 50} else { 51 echo "正常なデシリアライズに失敗しました。" . PHP_EOL; 52} 53echo PHP_EOL; 54 55// --- __wakeup を「バイパス」する可能性のある不正なシリアライズデータの例 --- 56echo "--- 不正なシリアライズデータによる __wakeup の「バイパス」 ---" . PHP_EOL; 57// ここでは、シリアライズされたオブジェクトのプロパティ数を意図的に偽装します。 58// 元の MyWakableClass は $data と $wakeupCalled の2つのプロパティを持ちますが、 59// シリアライズ文字列ではプロパティ数を「1」と偽装しています。 60// PHP 7.1 以降では、このようにプロパティ数が一致しない場合、unserialize() は 61// __wakeup を呼び出さず、__PHP_Incomplete_Class のインスタンスを返します。 62$maliciousSerializedString = 'O:14:"MyWakableClass":1:{s:4:"data";s:19:"不正なペイロードデータ";}'; 63echo "不正なシリアライズされた文字列: " . $maliciousSerializedString . PHP_EOL; 64 65// 不正なシリアライズ文字列からオブジェクトをデシリアライズ 66// このとき、MyWakableClass の __wakeup メソッドは呼び出されません。 67$unserializedMalicious = unserialize($maliciousSerializedString); 68 69if ($unserializedMalicious instanceof MyWakableClass) { 70 echo "MyWakableClass としてデシリアライズされました。" . PHP_EOL; 71 echo "__wakeup は呼び出されましたか? " . ($unserializedMalicious->wakeupCalled ? "はい" : "いいえ") . PHP_EOL; 72 echo "データ: " . $unserializedMalicious->data . PHP_EOL; 73} elseif ($unserializedMalicious instanceof __PHP_Incomplete_Class) { 74 echo "__PHP_Incomplete_Class としてデシリアライズされました。これは __wakeup が呼び出されなかったことを意味します。" . PHP_EOL; 75 // __PHP_Incomplete_Class のプロパティには直接アクセスできませんが、 76 // var_dump などで内部構造を確認できます。 77 // var_dump($unserializedMalicious); 78} else { 79 echo "不正なデシリアライズに失敗しました。" . PHP_EOL; 80} 81echo PHP_EOL; 82 83// 補足: 84// RequestParseBodyException::__wakeup は PHP 内部で利用されるメソッドであり、 85// 通常のアプリケーション開発者が直接このメソッドを呼び出したり、 86// 上記のような方法で「バイパス」したりするシナリオは存在しません。 87// このコード例は、__wakeup マジックメソッドの一般的な挙動と、 88// シリアライズデータの改ざんによる挙動の変化を理解するために提供されています。
PHPの__wakeupメソッドは、unserialize()関数によってオブジェクトが再構築された直後に自動的に呼び出される特別なマジックメソッドです。このメソッドは引数も戻り値も持ちません。主に、デシリアライズされたオブジェクトの状態を初期化したり、必要なリソースを再接続したりするために使用されます。
提供されたサンプルコードでは、MyWakableClassというクラスを使って__wakeupの挙動を示しています。オブジェクトを正常にシリアライズ(文字列に変換)し、その後デシリアライズ(オブジェクトに再構築)すると、__wakeupメソッドが期待通りに呼び出され、オブジェクトの状態が適切に設定されることがわかります。
次に、シリアライズデータ内のプロパティ数を意図的に偽装した不正なデータの場合が示されています。PHP 7.1以降では、シリアライズデータのプロパティ数がオブジェクトの実際のプロパティ数と一致しない場合、unserialize()は__wakeupメソッドを呼び出しません。代わりに、オブジェクトは不完全な状態を示す__PHP_Incomplete_Classのインスタンスとしてデシリアライズされ、結果として__wakeupの実行が「バイパス」されます。これは、意図しない動作やセキュリティ上のリスクを引き起こす可能性があるため、シリアライズデータを扱う際には注意が必要です。
なお、RequestParseBodyException::__wakeupはPHP内部で利用される例外クラスのメソッドであり、通常のアプリケーション開発者が直接操作することは想定されていません。このサンプルコードは、一般的な__wakeupの仕組みと、シリアライズデータの改ざんによるセキュリティ上の注意点を理解するために提供されています。
このサンプルコードは、PHPの__wakeupマジックメソッドが、オブジェクトのデシリアライズ(再構築)時に呼び出されることでオブジェクトの初期化を行う仕組みを示しています。特に、不正に改ざんされたシリアライズデータ(例えばプロパティ数を偽装したもの)をunserialize()関数で処理すると、__wakeupメソッドが呼び出されず、__PHP_Incomplete_Classとして扱われる「バイパス」の可能性があることに注意が必要です。このような__wakeupのバイパスは、アプリケーションが想定しない動作を引き起こしたり、セキュリティ上の脆弱性につながったりする恐れがあります。そのため、外部から受け取った信頼できないシリアライズデータを安易にunserialize()することは避けるべきです。なお、RequestParseBodyException::__wakeupはPHP内部で使用されるメソッドであり、通常のアプリケーション開発で直接利用するものではありません。
PHP __wakeupでRequestParseBodyExceptionを復元する
1<?php 2 3/** 4 * RequestParseBodyException::__wakeup() メソッドのサンプルコード 5 * 6 * __wakeupマジックメソッドは、PHPのunserialize()関数によってオブジェクトが 7 * デシリアライズ(文字列からオブジェクトへ復元)される直前に自動的に呼び出される特別なメソッドです。 8 * 9 * RequestParseBodyExceptionはPHP 8で導入された内部例外クラスであり、通常、ユーザーコードで 10 * その__wakeupメソッドを直接定義したり変更したりすることはありません。 11 * このメソッドが内部で存在する場合、それはオブジェクトが復元された際に、 12 * PHPエンジンが内部的な整合性を保つための処理(例えば、リソースの再初期化など)を 13 * 行うために利用されます。 14 * 15 * リファレンス情報: 16 * - メソッド名: __wakeup 17 * - 引数: なし 18 * - 戻り値: なし 19 * 20 * このサンプルコードでは、RequestParseBodyExceptionのインスタンスをシリアライズし、 21 * その後デシリアライズする過程を通じて、__wakeupメソッドが呼び出される 22 * タイミングと概念をシステムエンジニアを目指す初心者にも分かりやすく示します。 23 * 内部メソッドであるため、__wakeupが呼び出されてもユーザーに直接的な出力はありませんが、 24 * その存在と役割を理解することが目的です。 25 */ 26 27// 1. RequestParseBodyExceptionのインスタンスを作成します。 28// PHP 8のRequestParseBodyExceptionのコンストラクタはメッセージなどを引数に取ります。 29$originalException = new RequestParseBodyException( 30 'HTTPリクエストボディのパース中にエラーが発生しました。', 31 500 32); 33 34echo "--- 元の例外オブジェクト ---" . PHP_EOL; 35echo "メッセージ: " . $originalException->getMessage() . PHP_EOL; 36echo "コード: " . $originalException->getCode() . PHP_EOL . PHP_EOL; 37 38// 2. オブジェクトをシリアライズ(永続化のために文字列に変換)します。 39$serializedException = serialize($originalException); 40echo "--- シリアライズされた文字列 ---" . PHP_EOL; 41echo $serializedException . PHP_EOL . PHP_EOL; 42 43// 3. シリアライズされた文字列をデシリアライズ(オブジェクトに復元)します。 44// ここで unserialize() が実行されると、RequestParseBodyExceptionクラスに 45// __wakeupメソッドが定義されていれば、オブジェクトが完全に復元される直前に 46// その__wakeupメソッドが自動的に呼び出されます。 47// これはPHP内部でオブジェクトの整合性を確保するためのフックとして機能します。 48$restoredException = unserialize($serializedException); 49 50echo "--- デシリアライズ後のオブジェクト ---" . PHP_EOL; 51 52// 復元されたオブジェクトが期待通りの型であり、データが正しく復元されたかを確認します。 53if ($restoredException instanceof RequestParseBodyException) { 54 echo "オブジェクトは RequestParseBodyException として正常に復元されました。" . PHP_EOL; 55 echo "復元されたメッセージ: " . $restoredException->getMessage() . PHP_EOL; 56 echo "復元されたコード: " . $restoredException->getCode() . PHP_EOL; 57 // このデシリアライズの過程で__wakeupメソッドが呼び出されているはずですが、 58 // 内部メソッドのため、ユーザーコードからは直接その動作を観測することはできません。 59 // しかし、このステップで__wakeupが呼び出されるというPHPのメカニズムが働きます。 60} else { 61 echo "オブジェクトのデシリアライズに失敗したか、予期しない型が復元されました。" . PHP_EOL; 62} 63 64?>
PHP 8のRequestParseBodyExceptionクラスに存在する__wakeupメソッドは、PHPのunserialize()関数によってオブジェクトがデシリアライズ(文字列からオブジェクトへ復元)される直前に自動的に呼び出される特別なメソッドです。このメソッドは引数を取らず、戻り値もありません。RequestParseBodyExceptionはPHPの内部で定義された例外クラスであり、通常、開発者がこの__wakeupメソッドを直接記述したり変更したりすることはありません。内部的には、オブジェクトが復元された際に、PHPエンジンがそのオブジェクトの整合性を保つための初期化処理やリソースの再設定などを行うために利用されます。サンプルコードでは、RequestParseBodyExceptionのインスタンスをシリアライズし、その後デシリアライズする過程を示しています。このデシリアライズの際に、もし__wakeupメソッドがクラスに定義されていれば、それが自動的に実行されます。ユーザーコードからはその動作を直接確認できませんが、これはPHPがオブジェクトを安全に復元するための重要なメカニズムの一つです。
__wakeupは、unserialize()でオブジェクトが復元される直前にPHPが自動で呼び出す特別なメソッドです。RequestParseBodyExceptionのようなPHP内部クラスでは、このメソッドはPHPエンジンがオブジェクトの整合性を内部的に保つために利用されます。通常、このメソッドをユーザーが直接定義したり変更したりすることはありません。内部処理のため、__wakeupが呼び出されても、ユーザーコードから直接的な出力や動作を確認することはできません。しかし、PHPのデシリアライズ機構の一部として、その存在と役割を理解することが重要です。一般的に、unserialize()は信頼できない入力データに使用するとオブジェクトインジェクションなどの深刻なセキュリティリスクを引き起こすため、利用には極めて慎重になる必要があります。
PHP __wakeup マジックメソッドによるデシリアライズ処理
1<?php 2 3/** 4 * PHPのオブジェクトシリアライズ/デシリアライズ時に呼び出される 5 * マジックメソッド `__sleep` と `__wakeup` の動作を示すサンプルクラスです。 6 * 7 * RequestParseBodyException::__wakeup のような内部クラスの `__wakeup` メソッドも、 8 * オブジェクトがデシリアライズされた際に、同様に内部状態の復元のためにPHPによって利用されます。 9 */ 10class MySerializableObject 11{ 12 public string $name; 13 private ?string $connectionResource; // シリアライズ対象外のリソースを模倣 14 15 public function __construct(string $name) 16 { 17 $this->name = $name; 18 // コンストラクタで何らかのリソースを初期化する例 19 $this->connectionResource = 'db_conn_' . uniqid(); 20 echo "[CONSTRUCT] '{$this->name}' オブジェクトが作成されました。リソースID: {$this->connectionResource}\n"; 21 } 22 23 /** 24 * オブジェクトがシリアライズ(文字列化)される直前に自動的に呼び出されます。 25 * シリアライズすべきプロパティ名の配列を返します。 26 * ここでは、一時的なリソースである $connectionResource はシリアライズから除外します。 27 * 28 * @return string[] シリアライズするプロパティ名の配列 29 */ 30 public function __sleep(): array 31 { 32 echo "[__SLEEP] '{$this->name}' オブジェクトがシリアライズされます。connectionResource は除外。\n"; 33 return ['name']; // 'name' プロパティのみをシリアライズ対象とする 34 } 35 36 /** 37 * オブジェクトがデシリアライズ(オブジェクトに戻す)された直後に自動的に呼び出されます。 38 * `__sleep` で除外されたリソースの再初期化など、 39 * オブジェクトの状態を復元するために使用されます。 40 * 41 * RequestParseBodyException::__wakeup も、PHPの内部処理で 42 * デシリアライズされた例外オブジェクトの内部状態を適切に再構築するために利用されます。 43 */ 44 public function __wakeup(): void 45 { 46 echo "[__WAKEUP] '{$this->name}' オブジェクトがデシリアライズされました。connectionResource を再初期化。\n"; 47 // デシリアライズ後にリソースを再接続する例 48 $this->connectionResource = 'db_conn_reinit_' . uniqid(); 49 echo "[__WAKEUP] リソースが新しいIDで再初期化されました: {$this->connectionResource}\n"; 50 } 51 52 /** 53 * 現在のリソース識別子を返します。 54 */ 55 public function getConnectionResource(): ?string 56 { 57 return $this->connectionResource; 58 } 59} 60 61// ----------------------------------------------------------------------------- 62// サンプルコードの実行 63// ----------------------------------------------------------------------------- 64 65echo "--- 1. オリジナルオブジェクトの作成 ---\n"; 66$originalObject = new MySerializableObject('ユーザーA'); 67echo "オリジナルオブジェクトのリソースID: " . $originalObject->getConnectionResource() . "\n\n"; 68 69echo "--- 2. オブジェクトのシリアライズ ---\n"; 70// `serialize()` 関数が呼び出されると、自動的に `__sleep` メソッドが実行されます。 71// ここでは、`name` プロパティのみが文字列化されます。 72$serializedObject = serialize($originalObject); 73echo "シリアライズされた文字列: " . $serializedObject . "\n\n"; 74 75echo "--- 3. オブジェクトのデシリアライズ ---\n"; 76// `unserialize()` 関数が呼び出されると、自動的に `__wakeup` メソッドが実行されます。 77// `__wakeup` 内で `$connectionResource` が再初期化されます。 78$deserializedObject = unserialize($serializedObject); 79echo "デシリアライズされたオブジェクトの名前: " . $deserializedObject->name . "\n"; 80echo "デシリアライズされたオブジェクトのリソースID: " . $deserializedObject->getConnectionResource() . "\n\n"; 81 82echo "--- 4. オリジナルとデシリアライズされたオブジェクトの比較 ---\n"; 83echo "オリジナルオブジェクトのリソースID: " . $originalObject->getConnectionResource() . "\n"; 84echo "デシリアライズされたオブジェクトのリソースID: " . $deserializedObject->getConnectionResource() . "\n"; 85echo "上記のリソースIDが異なるのは、`__wakeup` で新しいリソースが割り当てられたためです。\n"; 86 87?>
PHPの__wakeupマジックメソッドは、オブジェクトが文字列化された状態(シリアライズ)から、再びPHPオブジェクトとして復元(デシリアライズ)された直後に、PHPによって自動的に呼び出される特別なメソッドです。このメソッドは引数を取らず、戻り値もありません。主な役割は、デシリアライズ時に失われたり、シリアライズ対象から除外されたりした一時的なリソース(例えばデータベース接続やファイルハンドルなど)を、オブジェクトが利用可能な状態に再初期化することです。
通常、オブジェクトをシリアライズする直前には__sleepマジックメソッドが呼び出され、シリアライズすべきプロパティのリストを返します。このとき、一時的なリソースなどはシリアライズ対象から除外されることがあります。__wakeupは、その後にデシリアライズされたオブジェクトの状態を適切に復元し、除外されたリソースを再確立するために利用されます。
サンプルコードでは、MySerializableObjectクラスが__sleepで接続リソースを除外し、__wakeupでそのリソースを新しく再初期化する一連の流れを示しています。RequestParseBodyExceptionのようなPHPの内部クラスに定義されている__wakeupも、同様に例外オブジェクトがデシリアライズされた際に、その内部状態を適切に再構築するためにPHPによって活用されます。このように、__wakeupはオブジェクトの安定した復元に不可欠な役割を担っています。
__wakeupメソッドは、PHPで文字列化されたオブジェクトを元の形に戻す(デシリアライズ)際に自動で呼び出される特別なメソッドです。主に、データベース接続などの一時的なリソースや外部の状態を、デシリアライズ後に安全に再接続・再初期化するために利用されます。コンストラクタとは異なり、__wakeupはオブジェクトが「目覚めた」後に必要な状態を復元する役割があります。RequestParseBodyException::__wakeupのようなPHP内部のオブジェクトでも、同様にデシリアライズ後の適切な状態復元に利用されています。
注意点として、unserialize()関数は、悪意のある入力によってセキュリティ上の脆弱性を引き起こす可能性があります。そのため、信頼できない外部からのデータに対してunserialize()を使用することは避け、PHP 7.0以降で導入されたunserialize()関数のallowed_classesオプションなどを利用して、デシリアライズ可能なクラスを制限するなどの対策を講じることが非常に重要です。