PHPでは、シリアル化関数を使用して、オブジェクト、配列などのデータ構造を文字列形式に変換し、データベース、ファイルシステム、またはその他の永続的なストレージに保存できるようにします。 Deserialize( unserialize )は、文字列を元のデータ構造に戻します。 Serializeを使用してオブジェクト状態を保存することは、特にユーザーセッション、キャッシュ、または異なるページ間でデータを渡す必要がある場合に一般的な手法です。
この記事では、PHPのシリアル化関数を介してオブジェクト状態を保存する方法について説明し、オブジェクトを持続するときに注意を払うためにいくつかのことを探ります。
Serialize関数は、PHP変数をパラメーターとして取得し、保存および転送できる文字列に変換します。たとえば、単純なオブジェクトの場合、それをシリアル化してデータベースまたはファイルに保存してから、脱isizationによってオブジェクトの元の状態を復元できます。
<?php
// 簡単なクラスを定義します
class User {
public $name;
public $email;
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
}
// オブジェクトを作成します
$user = new User("John Doe", "[email protected]");
// オブジェクトをシリアル化します
$serializedUser = serialize($user);
// シリアル化されたデータをファイルまたはデータベースに保存します
file_put_contents("user_data.txt", $serializedUser);
// 敏arialialializationプロセスをシミュレートします
$retrievedData = file_get_contents("user_data.txt");
$unserializedUser = unserialize($retrievedData);
// 出力スターリア化されたオブジェクト
echo "Name: " . $unserializedUser->name . "<br>";
echo "Email: " . $unserializedUser->email;
?>
定義オブジェクト:最初に、ユーザークラスが定義され、ユーザーの名前と電子メールが含まれているインスタンスユーザーが作成されます。
Serializeオブジェクト: Serialize($ user)を呼び出すことにより、オブジェクト$ユーザーを文字列に変換します。
データの保存:シリアル化されたデータは、ファイルシステムまたはデータベースに保存できます。ここでは、 user_data.txtファイルに保存します。
Deserialization :非顕著な関数を介してデータをオブジェクトに復元します。
出力データ:オブジェクトを降らせることにより、そのプロパティにアクセスできます。
シリアル化関数は非常に便利ですが、オブジェクトを持続するときに注意すべきことがいくつかあります。
オブジェクトが内部的に他のオブジェクトに依存している場合、またはオブジェクトのクラスが変更されている場合、脱出中に問題が発生する可能性があります。特に、クラスの構造が変化する場合、 Unserializeはオブジェクト状態を正しく復元しないため、エラーが発生します。
スターリア化操作には、特定のセキュリティリスクがあります。悪意のあるユーザーは、偽のシリアル化された文字列を構築して、PHPが安全でないコードを実行し、リモートコードの実行の脆弱性をトリガーすることさえあります。これを回避するために、次の測定値をとることができます。
特にデータ構造がより単純な場合は、シリアル化および非正規化の代わりにjson_encodeとjson_decodeを使用します。
脱isizedデータは、信頼できる情報源から確実に得られるように、厳密に検証されています。
PHPのさまざまなバージョンでは、特にクラスの内部実装が変更された場合、シリアル化と非正規化が異なる場合があります。したがって、アプリケーションでそれを使用する場合、バージョンの更新の可能性のある影響を考慮し、バージョンの互換性を確保する必要があります。
シリアル化された文字列は、元のデータよりも多くのストレージスペースを占有する場合があります。多数のオブジェクトを保存する場合、シリアル化データの空間オーバーヘッドを考慮する必要があります。
シリアル化されたデータをデータベースに保存する場合、フィールドの長さの制限に特別な注意を払う必要があります。たとえば、テキストまたはブロブタイプのフィールドは、シリアル化されたデータの大きなセグメントを保存できますが、より大きなオブジェクトの場合、ページングまたはその他のストレージ戦略を考慮する必要がある場合があります。