PHPマルチシーケンス化/逆シーケンス化の方法

3475 ワード

シーケンス化は、変数を保存または転送可能な文字列に変換するプロセスです.逆シーケンス化は、適切なときにこの文字列を元の変数に変換して使用します.この2つのプロセスを組み合わせることで、データの格納と転送が容易になり、プログラムのメンテナンス性が向上します.
1.serializeとunserialize関数
この2つは、PHPにおけるデータのシーケンス化および逆シーケンス化の共通の関数である.
<?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);
//     Array ( [a] => Apple [b] => banana [c] => Coconut )
 
?>

配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、逆シーケンス化されると問題が発生する可能性があります.この問題を克服するために、巧みなテクニックはbase 64_を使うことです.encodeとbase 64_decode.
$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 [b] => banana 1 => Coconut )

    XMLタグ文字が多く,このフォーマットのシーケンス化には多くの空間が占められていることがわかる.
    小結
    上記のすべての関数は配列変数をシーケンス化する際に正常に実行できるが,オブジェクトに適用すると異なる.例えばjson_encodeシーケンス化オブジェクトは失敗します.オブジェクトを逆シーケンス化すると、unserializeとevalは異なる効果を得ます.