ホームページ  >  記事  >  バックエンド開発  >  PHPのシリアル化にはどのような方法があるのでしょうか?

PHPのシリアル化にはどのような方法があるのでしょうか?

青灯夜游
青灯夜游オリジナル
2021-07-08 15:21:006105ブラウズ

PHP シリアル化方法: 1. Serialize() 関数、構文「serialize(value)」を使用します; 2. Base64_encode() 関数を使用します; 3. var_export() 関数を使用します; 4. wddx_serialize_value を使用します() 関数。

PHPのシリアル化にはどのような方法があるのでしょうか?

このチュートリアルの動作環境: Windows 7 システム、PHP 7.1 バージョン、DELL G3 コンピューター

シナリオ:

Cookie は複合フォーム データを格納できないため、多次元配列をシリアル化して Cookie に格納する必要がありますが、PHP のバージョンが低すぎる (5.2) ため、json_encode

はサポートされていません解決策 (シリアル化と逆シリアル化):

1、関数のシリアル化とシリアル化解除: 1 次元配列のみをサポートします。オブジェクト、json_encode はオブジェクトをサポートしません

PHP のすべての値は、serialize() 関数 (シリアル化) を使用して保存できる文字列に変換できます。 unserialize() 関数は、文字列を PHP の元の値に戻すことができます。これは逆シリアル化です。

オブジェクトを例に挙げると、オブジェクトをシリアル化すると、オブジェクトのすべての変数が保存されますが、オブジェクトのメソッドは保存されず、クラスの名前のみが保存されます。さらに、オブジェクトを逆シリアル化できるようにするには、オブジェクトのクラスが定義されている必要があります。クラス A のオブジェクトをシリアル化すると、オブジェクト内のすべての変数の値を含むクラス A に関連する文字列が返されます。

別のファイル内のオブジェクトを逆シリアル化する場合は、逆シリアル化の前にオブジェクトのクラスを定義する必要があります。これは、クラスを定義するファイルをインクルードするか、関数 spl_autoload_register() を使用することで実現できます。

serialize() 関数の構文形式は次のとおりです。

serialize(mixed $value)

$value はシリアル化する変数です。

serialize() 関数は、リソースを除く任意の型を処理できます。オブジェクトをシリアル化するとき、PHP はシーケンス アクションの前にオブジェクトの __sleep() メンバー関数を呼び出します。これにより、オブジェクトがシリアル化される前にクリーンアップ操作を実行できるようになります。同様に、unserialize() を使用してオブジェクトが逆シリアル化されると、__wakeup() メンバー関数が呼び出されます。

serialize() 関数を使用してオブジェクトをシリアル化した後、取得した文字列をファイルまたはデータベースに保存し、必要に応じて unserialize() 関数を使用して文字列を反転できます。

2、base64_encode とbase64_decode、同じ問題です。多次元はサポートされていません。base64 エンコードを使用すると、文字列の長さが長くなります。この問題を解決するには、gzcompress:

function my_serialize( $obj )
{
  return base64_encode(gzcompress(serialize($obj)));
}

//反序列化
function my_unserialize($txt)
{
  return unserialize(gzuncompress(base64_decode($txt)));
}

3 とともに使用できます。var_export と eval

$look_books = array($aid => array($cid => array('article_name' => $article->articlename, 'chapter_name' => $chapter->chaptername))) + $look_books;
            $look_books = var_export($look_books, true);
            setcookie('look_books', $look_books, $cookieTime, '/', '.dym.com');

は多次元配列をサポートしていますが、注意する必要があります。一重引用符と二重引用符はエスケープされます。文字により eval が失敗するため、エスケープ文字を削除する必要があります

stripcslashes() 即可。

4. wddx_serialize_value と wddx deserialize

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
  
//序列化数组
$s = wddx_serialize_value($a);
echo $s;
  
//输出结果(查看输出字符串的源码):<wddxPacket version=&#39;1.0&#39;><header/><data><struct><var name=&#39;a&#39;><string>Apple</string></var><var name=&#39;b&#39;><string>banana</string></var><var name=&#39;c&#39;><string>Coconut</string></var></struct></data></wddxPacket>
  
echo &#39;<br /><br />&#39;;
  
//反序列化
$o = wddx_deserialize($s);
print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )

Inこの方法では、XML ラベル自体が多くの文字を占有し、比較的メモリを消費します。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPのシリアル化にはどのような方法があるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。