PHPシーケンス化変数の4つの方法

3507 ワード

シーケンス化は、変数を保存または転送可能な文字列に変換するプロセスです.逆シーケンス化は、適切なときにこの文字列を元の変数に変換して使用します.この2つのプロセスを組み合わせることで、データの格納と転送が容易になり、プログラムのメンテナンス性が向上します. 
1.serializeとunserialize関数
この2つは、PHPにおけるデータのシーケンス化および逆シーケンス化の共通の関数である.
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');  
  
//       
$s = serialize($a);  
echo $s;  
//    :a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}  
  
echo '<br /><br />';  
  
//      
$o = unserialize($s);  
print_r($o);
配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、それらが逆シーケンス化されると、問題が発生する可能性があります.この問題を克服するために、巧みなテクニックはbase 64_を使うことです.encodeとbase 64_decode.
PHPコード
$obj = array();  
//シリアル化
$s = base64_encode(serialize($obj));  
//逆シーケンス化
$original = unserialize(base64_decode($s));  
しかしbase 64符号化は文字列の長さを増加させる.この問題を克服するためにgzcompressと併用できます.
//                
  
function my_serialize( $obj )  
{  
  return base64_encode(gzcompress(serialize($obj)));  
}  
  
//      
function my_unserialize($txt)  
{  
  return unserialize(gzuncompress(base64_decode($txt)));  
}

2.  json_encodeとjson_decode
JSON形式のシーケンス化と逆シーケンス化を使用するのは良い選択です.
json_の使用encodeとjson_decodeフォーマットの出力はserializeとunserializeフォーマットよりずっと速いです.
JSON形式は読み取り可能です.
JSON形式はserializeよりデータを返す結果が小さい.
JSON形式はオープンで移植可能です.他の言語でも使用できます.
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');  
  
//       
$s = json_encode($a);  
echo $s;  
//    :{"a":"Apple","b":"banana","c":"Coconut"}  
  
echo '<br /><br />';  
  
//      
$o = json_decode($s);
上記の例ではjson_Encode出力長は、前の例のserialize出力長よりも明らかに短い. 
3.  var_义齿
var_export関数は変数を文字列として出力します.evalは文字列をPHPコードとして実行し,最初の変数の内容を逆シーケンス化する.  
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');  
  
//       
$s = var_export($a , true);  
echo $s;  
//    : array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )  
  
echo '<br /><br />';  
  
//      
eval('$my_var=' . $s . ';');  
  
print_r($my_var);  
4.  wddx_serialize_valueとwddx deserialize
wddx_serialize_value関数は配列変数をシーケンス化し、XML文字列として出力できます.
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');  
  
//       
$s = wddx_serialize_value($a);  
echo $s;  
  
//    (          ):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>  
  
echo '<br /><br />';  
  
//      
$o = wddx_deserialize($s);  
  
print_r($o);
//出力結果:Array([a]=>Apple=>banana 1=>Coconut)
XMLタグ文字が多く,このフォーマットのシーケンス化には多くの空間が占められていることがわかる. 
結論
上記のすべての関数は配列変数をシーケンス化する際に正常に実行できるが,オブジェクトに適用すると異なる.例えばjson_encodeシーケンス化オブジェクトは失敗します.オブジェクトを逆シーケンス化すると、unserializeとevalは異なる効果を得ます. 
3 ways to serialize variables in php