ホームページ  >  記事  >  バックエンド開発  >  PHPチュートリアル - 逆シリアル化方法

PHPチュートリアル - 逆シリアル化方法

巴扎黑
巴扎黑オリジナル
2016-12-07 13:25:011065ブラウズ

1. シリアル化関数とシリアル化解除関数



これら 2 つは、PHP でデータをシリアル化および逆シリアル化するための一般的な関数です。


$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'ココナッツ');

$s = Serialize($a);

echo $s;

//出力結果: a:3:{s:1:"a";s:5:"Apple";s:1: " b";s:6:"バナナ";s:1:"c";s:7:"ココナッツ";}

echo '

';

/ /逆シリアル化

$o = unserialize($s);

print_r($o);

//出力結果 Array ( [a] => Apple [b] => バナナ [c] => ; Coconut )

?>

配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、逆シリアル化後に問題が発生する可能性があります。この問題を克服するための巧妙なトリックは、base64_encode とbase64_decode を使用することです。

$obj = array();

//シリアル化

$s =base64_encode(serialize($obj));

//逆シリアル化

$original = unserialize($s); Base64 エンコードでは文字列の長さが長くなります。この問題を解決するには、gzcompress と併用します。

//オブジェクトをシリアル化する関数を定義します

function my_serialize( $obj )

{

Returnbase64_encode(gzcompress(serialize($obj))))

//逆シリアル化

function my_unser ialize($ txt)

{

return unserialize(gzuncompress(base64_decode($txt)));

}

2. json_encode と json_decode を使用する



シリアル化は良い選択です。



json_encode および json_decode 形式の出力を使用すると、形式をシリアル化およびシリアル化解除するよりもはるかに高速になります。

JSON形式が読み取り可能です。

JSON 形式はシリアル化よりも小さいデータを返します。

JSON 形式はオープンで移植可能です。他の言語でも同様に使用できます。

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'ココナッツ');

//シリアル化された配列

$s = json_encode ($a);

echo $s;

//出力結果: {"a":"バナナ","c":"ココナッツ"}

'< />
';

//逆シリアル化

$o = json_decode($s);

上記の例では、json_encode 出力の長さは前の例のシリアル化出力長より明らかに長くなります。短くしてください。



3. var_export と eval



var_export 関数は変数を文字列として出力し、eval は文字列を PHP コードとして実行し、逆シリアル化して元の変数の内容を取得します。



$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'ココナッツ');

$s = var_export($a, true);



echo $s;



//出力結果: array ( 'a' => 'Apple', 'b' => ' ', 'c' => 'ココナッツ', )


echo '

'



eval(' $my_var= ' . $s . ';');



print_r($my_var);

4. wddx_serialize_value 関数は配列変数をシリアル化して XML 文字列として出力できます。



$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'ココナッツ'); $s = wddx_serialize_value($a);

echo $s;



//出力結果 (出力文字列のソースコードを表示): Appleバナナココナッツ '

'



//デシリアライズ

$o = wddx_deserialize($s);print_r($o);

//出力結果: Array ( [a] => Apple [b] => Banana 1 => Coconut )

XMLタグ文字が多く含まれていることがわかります。この形式のシリアル化には依然として多くのスペースが必要です。



まとめ



上記の関数はすべて、配列変数をシリアル化する場合は通常どおり実行できますが、オブジェクトに適用する場合は異なります。たとえば、json_encode シリアル化オブジェクトは失敗します。オブジェクトを逆シリアル化する場合、unserialize と eval の効果は異なります。

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