【PHP8.x】serialize()関数の使い方
serialize関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
serialize関数は、PHPの値をシリアライズ(直列化)する関数です。シリアライズとは、複雑なデータ構造(例えば、配列やオブジェクト)を、文字列として表現できるように変換する処理のことです。この文字列は、後で unserialize 関数を使って元のデータ構造に戻すことができます。
serialize関数は、主にデータをファイルに保存したり、ネットワークを通じて送信したりする際に利用されます。例えば、セッション情報を保存したり、データベースにオブジェクトを格納したりする際に便利です。
serialize関数は、PHPのほとんどのデータ型をシリアライズできます。具体的には、整数、浮動小数点数、文字列、配列、オブジェクト、そしてリソース型(ただし、リソース型はシリアライズできません)などを扱えます。
シリアライズされた文字列は、データの型と値を保持しており、unserialize関数によって元の状態に復元されます。ただし、オブジェクトをシリアライズする場合は、オブジェクトのクラス定義が unserialize 時に利用可能である必要があります。クラス定義が存在しない場合、オブジェクトは __PHP_Incomplete_Class という特別なクラスのインスタンスとして復元されます。
serialize関数は、データの永続化や転送において非常に有用な関数ですが、セキュリティ上の注意点もあります。信頼できないソースからのシリアライズされたデータを unserialize すると、悪意のあるコードが実行される可能性があります。そのため、unserialize 関数を使用する際には、データの出所に注意し、十分な検証を行うことが重要です。
構文(syntax)
1serialize ( mixed $value ) : string
引数(parameters)
mixed $value
- mixed $value: シリアライズする値を指定します。PHPのすべての型に対応しています。
戻り値(return)
string
PHPのserialize()関数は、PHPの値を文字列形式に変換して返します。この文字列は、後でunserialize()関数を使って元のPHPの値に戻すことができます。
サンプルコード
PHP serialize_precision による精度制御
1<?php 2 3/** 4 * serialize_precision が浮動小数点数のシリアライズに与える影響を示すサンプルコードです。 5 * 6 * serialize_precision は、浮動小数点数をシリアライズする際に 7 * どれだけの精度で値を文字列に変換するかを制御します。 8 */ 9function demonstrateSerializePrecisionEffect(): void 10{ 11 // 多数の小数点以下の桁を持つ浮動小数点数を準備します。 12 $floatValue = 0.12345678901234567; 13 echo "元の浮動小数点数: " . $floatValue . "\n\n"; 14 15 // 現在の serialize_precision 設定を保存しておき、後で元に戻せるようにします。 16 $originalPrecision = ini_get('serialize_precision'); 17 18 // ケース 1: serialize_precision を低い値 (例: 6) に設定します。 19 // これにより、シリアライズされる浮動小数点数の精度が切り詰められます。 20 ini_set('serialize_precision', '6'); 21 $serializedLowPrecision = serialize($floatValue); 22 echo "--- serialize_precision = 6 の場合 ---\n"; 23 echo "シリアライズされた文字列: " . $serializedLowPrecision . "\n"; 24 echo "この場合、'd:' の後の数値の小数点以下の桁数が制限されていることに注目してください。\n\n"; 25 26 // ケース 2: serialize_precision を高い値 (例: 17, PHP 7.1+ のデフォルト) に設定します。 27 // これにより、シリアライズされる浮動小数点数でより高い精度が保持されます。 28 ini_set('serialize_precision', '17'); 29 $serializedHighPrecision = serialize($floatValue); 30 echo "--- serialize_precision = 17 の場合 ---\n"; 31 echo "シリアライズされた文字列: " . $serializedHighPrecision . "\n"; 32 echo "この場合、'd:' の後に低い精度設定よりも多くの桁が保持されていることに注目してください。\n\n"; 33 34 // serialize_precision を元の設定に戻します。 35 // これは、より大きなアプリケーションの一部である場合に、他の処理に影響を与えないための良い習慣です。 36 ini_set('serialize_precision', $originalPrecision); 37} 38 39// 関数を実行してデモンストレーションを開始します。 40demonstrateSerializePrecisionEffect();
PHPのserialize関数は、配列やオブジェクトなど、様々なデータ型(mixed $value)のPHPの値を、保存や転送に適した文字列形式(string)に変換する役割を持ちます。これにより、複雑なデータを一時的にファイルに保存したり、ネットワーク経由で送信したりすることが容易になります。
このサンプルコードでは、serialize関数が浮動小数点数をシリアライズする際の挙動を、serialize_precisionというPHPの設定を通して詳しく説明しています。serialize_precisionは、浮動小数点数を文字列に変換する際に、小数点以下の桁数をどこまで保持するかを制御する設定です。
コードでは、まず多数の小数点以下の桁を持つ浮動小数点数を準備し、serialize_precisionの設定を低い値(例: 6)にした場合と、高い値(例: 17)にした場合で、それぞれserialize関数を実行して結果を比較しています。serialize_precisionが低い場合、シリアライズされた文字列中の浮動小数点数の精度が制限され、値が切り詰められます。一方、serialize_precisionが高い場合、元の数値により近い多くの小数点以下の桁が保持された状態でシリアライズされることが確認できます。
この設定は、データの精度が重要なアプリケーションにおいて、意図しない数値の丸め込みを防ぐために理解しておくべき重要なポイントです。コードの最後でserialize_precisionの設定を元の値に戻しているのは、他のプログラムの動作に影響を与えないための良い実践方法です。
serialize関数はPHPの変数を文字列に変換し、アプリケーション内部でのデータ保存や受け渡しに利用されます。浮動小数点数を扱う際は、serialize_precision設定に特に注意が必要です。この値が低いと、シリアライズ時に小数点以下の精度が失われ、元の値と異なるデータが生成される可能性があります。これにより、データを保存・復元した際に期待通りの値が得られないことがあります。ini_setで一時的に設定を変更した場合、他の処理への影響を避けるため、必ず元の設定に戻すようにしてください。さらに、信頼できないソースから受け取ったserializeデータを安易にunserializeすると、セキュリティ上の脆弱性につながる危険があるため、特に注意が必要です。PHP以外のシステムとの連携には、より汎用的なJSON形式の利用も検討しましょう。
PHPのserializeとJSONエンコードを比較する
1<?php 2 3/** 4 * PHPのserialize関数とJSONエンコードの比較を示す関数。 5 * システムエンジニアを目指す初心者向けに、それぞれの用途と出力の違いを解説します。 6 */ 7function demonstrateSerializationAndJsonComparison(): void 8{ 9 // 比較対象とするPHPのデータ(配列と連想配列の組み合わせ) 10 $data = [ 11 'name' => 'Alice', 12 'age' => 30, 13 'isActive' => true, 14 'hobbies' => ['reading', 'coding'], 15 'contact' => ['email' => 'alice@example.com', 'phone' => null], // null値も含む 16 ]; 17 18 echo "--- 元のPHPデータ ---\n"; 19 print_r($data); 20 echo "\n"; 21 22 // 1. serialize関数: PHPの値をPHP独自の文字列形式に変換します。 23 // 主にPHPアプリケーション内部でのデータ保存(例: セッションデータ、キャッシュ)や転送に利用されます。 24 // 他のプログラミング言語では通常解読できません。 25 $serializedData = serialize($data); 26 echo "--- serializeの結果 (PHP独自の文字列) ---\n"; 27 echo $serializedData . "\n"; 28 echo "データ型: " . gettype($serializedData) . "\n\n"; 29 30 // unserialize関数で元のPHPデータに復元します。 31 $unserializedData = unserialize($serializedData); 32 echo "--- unserializeの結果 ---\n"; 33 print_r($unserializedData); 34 echo "\n"; 35 36 // 2. json_encode関数: PHPの値をJSON形式の文字列に変換します。 37 // JSONは汎用的なデータ交換フォーマットであり、Web APIなどで異なるシステム間でデータをやり取りする際に広く利用されます。 38 // 人間にも比較的読みやすい形式です。 39 $jsonData = json_encode($data, JSON_PRETTY_PRINT); // JSON_PRETTY_PRINTで見やすく整形 40 echo "--- json_encodeの結果 (JSON形式の文字列) ---\n"; 41 echo $jsonData . "\n"; 42 echo "データ型: " . gettype($jsonData) . "\n\n"; 43 44 // JSON文字列をjson_decode関数で元のPHPデータに復元します。 45 // 第二引数にtrueを指定すると、オブジェクトではなく連想配列として復元されます。 46 $decodedData = json_decode($jsonData, true); 47 echo "--- json_decodeの結果 ---\n"; 48 print_r($decodedData); 49 echo "\n"; 50 51 echo "--- まとめ ---\n"; 52 echo "・ serialize はPHP内でのデータ永続化に適しており、元のデータ型を忠実に再現します。\n"; 53 echo "・ json_encode は汎用的なデータ交換に適しており、他の言語との連携に強みがあります。\n"; 54} 55 56// 関数を実行して、serializeとJSONエンコードの動作を確認します。 57demonstrateSerializationAndJsonComparison(); 58
PHPのserialize関数は、配列やオブジェクトなど、あらゆるPHPのデータ(mixed $value)を、PHPが理解できる特定の文字列形式(string)に変換します。この変換された文字列は、PHPアプリケーションの内部で、データを一時的にファイルやデータベースに保存したり、ネットワーク経由でPHPプロセス間でデータをやり取りしたりする際に利用されます。serializeによって変換されたデータは、後でunserialize関数を使うことで、元のPHPのデータ構造に忠実に復元することが可能です。
一方、json_encode関数もPHPのデータを文字列に変換しますが、こちらは「JSON(JavaScript Object Notation)」という、Web APIなどで広く使われる汎用的なデータ交換フォーマットを採用します。json_encodeが返すJSON形式の文字列は、人間にも比較的読みやすく、PHP以外のプログラミング言語との連携にも適しています。
このように、serializeは主にPHPアプリケーション内でのデータ永続化や、PHP間でのデータ受け渡しに適しており、元のデータ型を厳密に保持する特徴があります。対してjson_encodeは、異なるシステム間でのデータ交換や、JavaScriptなどの他の言語との連携に強みがあります。用途に応じて適切な関数を選択することが重要です。
serializeはPHP内部でデータを保存・転送する際に利用し、PHPのデータ型を忠実に保持できますが、他のプログラミング言語とのデータ連携には適していません。信頼できないソースからのシリアライズデータをunserializeすると、セキュリティ上の脆弱性につながる可能性があるため特に注意が必要です。一方、json_encodeはJSONという汎用的なデータ形式に変換するため、Web APIなどで異なるシステムとデータをやり取りする際に広く利用されます。ただし、json_encodeではPHPのオブジェクトがJSONオブジェクトに変換される際、元のクラス情報は失われる点や、json_decodeで連想配列として復元するには第二引数にtrueを指定する必要がある点に留意してください。用途に応じて適切な関数を選択することが大切です。
PHP serialize/unserializeでデータを変換する
1<?php 2 3// serialize関数は、PHPの様々なデータ型(配列、オブジェクトなど)を 4// 後で元の形に戻せるような「文字列」に変換します。 5// この文字列は、ファイルに保存したり、ネットワーク経由で送信したりするのに便利です。 6// unserialize関数は、そのシリアライズされた文字列を元のPHPのデータ型に復元します。 7 8echo "--- 配列のシリアライズとデシリアライズの例 ---\n"; 9 10// 元のデータとして連想配列を準備 11$originalArray = [ 12 'name' => 'Alice', 13 'age' => 30, 14 'occupation' => 'Software Engineer', 15 'hobbies' => ['reading', 'coding', 'hiking'] 16]; 17 18echo "元の配列:\n"; 19print_r($originalArray); 20 21// 配列を文字列にシリアライズ 22$serializedString = serialize($originalArray); 23 24echo "\nシリアライズされた文字列:\n"; 25echo $serializedString . "\n"; 26 27// シリアライズされた文字列を元の配列にデシリアライズ 28$unserializedArray = unserialize($serializedString); 29 30echo "\nデシリアライズされた配列:\n"; 31print_r($unserializedArray); 32 33// 元の配列とデシリアライズされた配列が同じ内容であることを確認 34echo "\n元の配列とデシリアライズされた配列は同じですか? " . 35 (serialize($originalArray) === serialize($unserializedArray) ? "はい" : "いいえ") . "\n"; 36 37echo "\n--- オブジェクトのシリアライズとデシリアライズの例 ---\n"; 38 39// シリアライズ対象となるシンプルなクラスを定義 40class UserProfile 41{ 42 public string $username; 43 public int $id; 44 private string $email; // privateプロパティもシリアライズされます 45 46 public function __construct(string $username, int $id, string $email) 47 { 48 $this->username = $username; 49 $this->id = $id; 50 $this->email = $email; 51 } 52 53 public function getEmail(): string 54 { 55 return $this->email; 56 } 57} 58 59// UserProfileオブジェクトのインスタンスを作成 60$originalObject = new UserProfile('BobSmith', 101, 'bob.smith@example.com'); 61 62echo "元のオブジェクト:\n"; 63echo "ユーザー名: " . $originalObject->username . "\n"; 64echo "ID: " . $originalObject->id . "\n"; 65echo "メールアドレス: " . $originalObject->getEmail() . "\n"; 66 67// オブジェクトを文字列にシリアライズ 68$serializedObjectString = serialize($originalObject); 69 70echo "\nシリアライズされたオブジェクト文字列:\n"; 71echo $serializedObjectString . "\n"; 72 73// シリアライズされた文字列を元のオブジェクトにデシリアライズ 74$unserializedObject = unserialize($serializedObjectString); 75 76echo "\nデシリアライズされたオブジェクト:\n"; 77// デシリアライズ後も元のオブジェクトの状態が復元されていることを確認 78echo "ユーザー名: " . $unserializedObject->username . "\n"; 79echo "ID: " . $unserializedObject->id . "\n"; 80echo "メールアドレス: " . $unserializedObject->getEmail() . "\n"; // privateプロパティもアクセス可能 81 82// 元のオブジェクトとデシリアライズされたオブジェクトが同じ内容であることを確認 83echo "\n元のオブジェクトとデシリアライズされたオブジェクトは同じですか? " . 84 (serialize($originalObject) === serialize($unserializedObject) ? "はい" : "いいえ") . "\n"; 85 86?>
serialize関数は、PHPの配列やオブジェクトといった複雑なデータ構造を、後で元の形に復元できる「文字列」に変換する機能を提供します。この変換された文字列は、ファイルへの保存やデータベースへの格納、またはネットワークを通じて他のシステムへデータを送信する際に非常に便利です。
serialize関数はmixed $valueという引数を受け取ります。これは、どのようなデータ型(整数、文字列、配列、オブジェクトなど)でもシリアライズの対象にできることを意味します。戻り値はstring型で、変換されたシリアライズ済みの文字列が返されます。
対となるunserialize関数は、このシリアライズされた文字列を読み込み、元のPHPのデータ構造へと正確に復元する役割を担います。これにより、一度文字列化したデータも、プログラム内で再び操作可能な形に戻すことができます。
サンプルコードでは、まず連想配列をserializeで文字列に変換し、その後unserializeで元の配列に復元する例を示しています。また、クラスのインスタンス(オブジェクト)も同様にシリアライズとデシリアライズが可能であり、privateプロパティを含むオブジェクトの状態も完全に復元されることが確認できます。このように、serializeとunserializeはPHPにおけるデータの永続化や交換に不可欠な機能です。
unserialize関数は、信頼できない外部からの入力に対して使用すると、悪意のあるコード実行につながる重大なセキュリティリスクがあります。そのため、シリアライズされた文字列の出所が明確で安全である場合のみ利用してください。オブジェクトをデシリアライズする際には、元のクラス定義が実行環境に必要です。クラス定義が変更されると、古いシリアライズデータは正しく復元できない場合があります。異なるプログラミング言語間でデータをやり取りする際には、serialize形式はPHP固有のため不向きです。そのようなケースでは、より汎用的なJSON形式(json_encode/json_decode)の利用を推奨します。
PHP serializeとjson_encodeの比較
1<?php 2 3/** 4 * PHPのserialize関数とjson_encode関数を使用して、 5 * データを文字列形式に変換する方法を比較するサンプルコードです。 6 * 7 * serializeはPHP固有の形式で、json_encodeは汎用的なJSON形式で出力します。 8 */ 9function demonstrateDataSerializationComparison(): void 10{ 11 // 変換対象のPHPデータ(配列)を用意します 12 $phpData = [ 13 'name' => 'John Doe', 14 'age' => 30, 15 'isActive' => true, 16 'roles' => ['admin', 'editor'] 17 ]; 18 19 // 元のPHPデータを出力 20 echo "--- Original PHP Data ---\n"; 21 var_dump($phpData); 22 23 // 1. serialize() を使用してデータをPHP固有の文字列形式に変換します 24 // この形式は、PHPアプリケーション内でのデータの保存や転送に適しています。 25 $serializedString = serialize($phpData); 26 echo "\n--- Data serialized using serialize() ---\n"; 27 echo $serializedString . "\n"; 28 29 // serialize() で変換された文字列を元のPHPデータに戻す例 30 $unserializedData = unserialize($serializedString); 31 echo "\n--- Data unserialized using unserialize() ---\n"; 32 var_dump($unserializedData); 33 34 // 2. json_encode() を使用してデータをJSON形式の文字列に変換します 35 // JSONはWebAPIなどで広く使われる、プログラミング言語に依存しないデータ形式です。 36 $jsonString = json_encode($phpData, JSON_PRETTY_PRINT); // JSON_PRETTY_PRINTで見やすく整形 37 echo "\n--- Data encoded to JSON using json_encode() ---\n"; 38 echo $jsonString . "\n"; 39 40 // json_encode() で変換されたJSON文字列を元のPHPデータに戻す例 41 // 第二引数にtrueを渡すと連想配列としてデコードされます。 42 $decodedData = json_decode($jsonString, true); 43 echo "\n--- Data decoded from JSON using json_decode() ---\n"; 44 var_dump($decodedData); 45} 46 47// 関数を実行してデモンストレーションを開始します 48demonstrateDataSerializationComparison(); 49 50?>
PHPのserialize関数は、配列やオブジェクトといったPHPの様々なデータ(mixed $value)を、PHPが読み書きできる特定の文字列形式(string)に変換します。この機能は、PHPアプリケーション内でデータをファイルに保存したり、セッション管理に利用したりするなど、主にPHP環境内部でのデータ保存や転送に適しており、unserialize関数と組み合わせて元のデータに復元できます。
サンプルコードでは、このserialize関数とjson_encode関数の比較を示しています。json_encodeもPHPデータを文字列に変換しますが、その形式はJSON(JavaScript Object Notation)という汎用的なものです。JSONはプログラミング言語に依存しないため、Web APIなどを介してPHPとJavaScriptといった異なるシステム間でデータをやり取りする際によく利用されます。json_encodeでJSON形式にしたデータは、json_decode関数で元のPHPデータに戻すことが可能です。
このように、両関数はデータを文字列化する目的は共通ですが、serializeはPHP固有の環境内でのデータ管理に、json_encodeは異なるシステム間のデータ連携に適しているという違いがあります。
PHPのserialize関数は、PHPデータ(オブジェクトを含む)をPHP固有の文字列形式に変換し、unserializeで元のデータに戻すための機能です。主にPHPアプリケーション内部でのデータ永続化や、同一のPHP環境間でのデータ交換に利用されます。
これに対し、json_encodeはJSON形式という汎用的な文字列に変換するため、異なるプログラミング言語やシステム間でデータをやり取りする際に広く使われます。
重要な注意点として、unserializeは信頼できない外部からの入力に対して使用しないでください。悪意のあるシリアライズデータがPHPオブジェクトインジェクションなどの深刻な脆弱性を引き起こす可能性があります。そのため、外部から受け取るデータには、より安全なjson_decodeの利用を強く推奨します。用途に応じて適切な関数を選択することが大切です。