【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と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_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形式の利用も検討しましょう。