【PHP8.x】Serializable::unserialize()メソッドの使い方
unserializeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
unserializeメソッドは、PHPのSerializableインターフェースを実装したクラスにおいて、オブジェクトの逆シリアライズ(復元)を実行するメソッドです。このメソッドは、外部から受け取ったシリアライズされたデータ(文字列形式)を基に、現在のオブジェクトの状態を再構築するために使用されます。通常、開発者がこのメソッドを直接呼び出すことはなく、PHPの組み込み関数であるunserialize()が、Serializableインターフェースを実装したオブジェクトを復元する際に、内部的に自動でこのメソッドを呼び出します。
unserializeメソッドは、$serializedという名前の引数を一つ受け取ります。この引数には、対象のオブジェクトが以前にシリアライズされた際のデータが文字列として渡されます。開発者がこのメソッドを実装する主な目的は、オブジェクトのプロパティをどのように復元するかについて、カスタムのロジックを細かく制御することにあります。
例えば、オブジェクトがファイルハンドルやデータベース接続といったリソースを保持していた場合、シリアライズ時にはこれらのリソース自体は保存できません。そのため、unserializeメソッド内で、これらのリソースを再接続したり、復元時に特定のデータを変換したりする処理を記述することができます。メソッドの実装では、受け取った$serializedデータを利用して、現在のオブジェクトのプロパティに適切な値を設定し、オブジェクトを有効な状態に戻す処理を記述します。これにより、オブジェクトはシリアライズされる前の状態に正確に復元され、アプリケーション内で利用できるようになります。
構文(syntax)
1public function unserialize(string $data): void
引数(parameters)
string $data
- string $data: シリアライズされたPHP値を含む文字列
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHPのunserializeからJSONを生成する
1<?php 2 3/** 4 * Serializableインターフェースを実装したサンプルクラス。 5 * このクラスは、自身をシリアライズ可能な形式に変換し、またシリアライズされたデータから自身を復元する方法を定義します。 6 * 7 * 注意: PHP 8ではSerializableインターフェースは非推奨となっており、 8 * 代替として __serialize() および __unserialize() マジックメソッド、 9 * または JsonSerializable インターフェースの使用が推奨されています。 10 * しかし、リファレンス情報に基づき、ここではSerializableインターフェースの実装例を示します。 11 */ 12class UserProfile implements Serializable 13{ 14 private string $username; 15 private int $userId; 16 private array $preferences; 17 18 /** 19 * コンストラクタ。UserProfileオブジェクトを初期化します。 20 * 21 * @param string $username ユーザー名 22 * @param int $userId ユーザーID 23 * @param array $preferences ユーザー設定 24 */ 25 public function __construct(string $username, int $userId, array $preferences = []) 26 { 27 $this->username = $username; 28 $this->userId = $userId; 29 $this->preferences = $preferences; 30 } 31 32 /** 33 * オブジェクトの現在の状態をシリアライズし、文字列として返します。 34 * PHPの組み込み関数 serialize() がこのオブジェクトを処理する際に、このメソッドが自動的に呼び出されます。 35 * 36 * @return string オブジェクトのシリアライズされたデータ 37 */ 38 public function serialize(): string 39 { 40 // オブジェクトのプロパティを連想配列としてまとめ、PHPの組み込み serialize() 関数でシリアライズします。 41 return serialize([ 42 'username' => $this->username, 43 'userId' => $this->userId, 44 'preferences' => $this->preferences, 45 ]); 46 } 47 48 /** 49 * シリアライズされたデータからオブジェクトの状態を復元します。 50 * PHPの組み込み関数 unserialize() がこのオブジェクトを復元する際に、このメソッドが自動的に呼び出されます。 51 * 52 * リファレンス情報にある通り、このメソッド自体の戻り値は「戻り値なし (void)」です。 53 * メソッド内でオブジェクトのプロパティを更新することで状態を復元します。 54 * 55 * @param string $data シリアライズされたデータ文字列 56 * @return void 57 */ 58 public function unserialize(string $data): void 59 { 60 // シリアライズされたデータをPHPの組み込み unserialize() 関数でデシリアライズします。 61 $unserializedData = unserialize($data); 62 63 // デシリアライズされたデータを使って、現在のオブジェクトのプロパティを復元します。 64 // 未定義のキーがないように、null合体演算子 (??) を使用してデフォルト値を提供します。 65 $this->username = $unserializedData['username'] ?? 'Guest'; 66 $this->userId = $unserializedData['userId'] ?? 0; 67 $this->preferences = $unserializedData['preferences'] ?? []; 68 } 69 70 /** 71 * オブジェクトのデータを連想配列として取得します。 72 * このメソッドは、オブジェクトのデータをJSON形式に変換する際に役立ちます。 73 * 74 * @return array オブジェクトのプロパティを表す連想配列 75 */ 76 public function toArray(): array 77 { 78 return [ 79 'username' => $this->username, 80 'user_id' => $this->userId, 81 'preferences' => $this->preferences, 82 ]; 83 } 84} 85 86// --- PHPのunserialize関数を使用したシリアライズデータの復元とJSON変換のサンプル --- 87 88// 1. オリジナルのUserProfileオブジェクトを作成します。 89$originalUserProfile = new UserProfile('Alice Smith', 1001, ['theme' => 'dark', 'notifications' => true]); 90 91// 2. オブジェクトをPHPの組み込みserialize()関数でシリアライズします。 92// この時、UserProfile::serialize() メソッドが内部的に呼び出されます。 93$serializedString = serialize($originalUserProfile); 94 95echo "--- シリアライズされたデータ (PHP形式) ---" . PHP_EOL; 96echo $serializedString . PHP_EOL . PHP_EOL; 97 98// 3. シリアライズされた文字列をPHPの組み込みunserialize()関数でデシリアライズ(復元)します。 99// この時、UserProfile::unserialize() メソッドが内部的に呼び出され、 100// unserialize() 関数自体は復元されたオブジェクトを返します。 101$restoredUserProfile = unserialize($serializedString); 102 103echo "--- 復元されたオブジェクトのデータ ---" . PHP_EOL; 104if ($restoredUserProfile instanceof UserProfile) { 105 // toArray() メソッドを使って、復元されたオブジェクトのデータを連想配列として取得し表示します。 106 print_r($restoredUserProfile->toArray()); 107} else { 108 echo "エラー: オブジェクトの復元に失敗しました。" . PHP_EOL; 109} 110echo PHP_EOL; 111 112// 4. 復元されたオブジェクトのデータをJSON形式に変換します。 113if ($restoredUserProfile instanceof UserProfile) { 114 // toArray() で取得した配列を json_encode() 関数でJSON文字列に変換します。 115 // JSON_PRETTY_PRINT は、読みやすいようにJSONを整形するためのオプションです。 116 $jsonOutput = json_encode($restoredUserProfile->toArray(), JSON_PRETTY_PRINT); 117 118 echo "--- 復元されたデータから生成されたJSON形式 ---" . PHP_EOL; 119 echo $jsonOutput . PHP_EOL; 120} 121
PHPのSerializableインターフェースは、オブジェクトの状態を文字列化(シリアライズ)し、その文字列から元のオブジェクトに復元(デシリアライズ)する機能を提供します。サンプルコードでは、UserProfileクラスがこのインターフェースを実装し、特にunserializeメソッドの動作に焦点を当てています。
Serializable::unserializeメソッドは、シリアライズされたデータ文字列を受け取り、そのデータに基づいてオブジェクト自身のプロパティを復元する役割を担います。引数 $data には、serializeメソッドによって生成されたオブジェクトの状態を表す文字列が渡されます。このメソッドの戻り値はvoid(何も返さない)です。これは、新しいオブジェクトを返すのではなく、メソッドが呼び出された既存のオブジェクトの内部状態を直接更新して復元するためです。
まずUserProfileオブジェクトを作成し、PHPの組み込み関数serialize()で文字列化します。この時、UserProfile::serialize()メソッドが内部的に呼び出されます。次に、この文字列をPHPの組み込み関数unserialize()に渡すと、UserProfile::unserialize()メソッドが自動的に呼び出され、文字列内のデータからオブジェクトのプロパティが復元されます。復元されたオブジェクトのデータをtoArray()メソッドで配列に変換後、json_encode()関数でJSON形式に出力し、データの活用方法を示しています。PHP 8ではSerializableインターフェースは非推奨ですが、リファレンスに基づきその挙動を解説しています。
PHP 8では、Serializableインターフェースは非推奨であり、__serialize()や__unserialize()マジックメソッド、またはJsonSerializableインターフェースの使用が推奨されています。
特に、unserialize関数は信頼できない外部からのデータに使用すると、「オブジェクトインジェクション」という深刻なセキュリティ脆弱性を引き起こす可能性があります。そのため、利用は極力避け、安全性が確保された内部データに限定してください。
サンプルコードのunserializeメソッド自体はオブジェクト内部の状態を復元し戻り値はありませんが、PHP組み込みのunserialize関数は復元されたオブジェクトを返します。
また、PHPのシリアライズデータはJSONとは異なる形式のため、相互に直接変換することはできません。JSONとして扱いたい場合は、toArray()メソッドのようにデータを配列に変換してからjson_encode()関数を使用してください。