PHPマルチシーケンス化/逆シーケンス化の方法
3475 ワード
シーケンス化は、変数を保存または転送可能な文字列に変換するプロセスです.逆シーケンス化は、適切なときにこの文字列を元の変数に変換して使用します.この2つのプロセスを組み合わせることで、データの格納と転送が容易になり、プログラムのメンテナンス性が向上します.
1.serializeとunserialize関数
この2つは、PHPにおけるデータのシーケンス化および逆シーケンス化の共通の関数である.
配列値に二重引用符、一重引用符、コロンなどの文字が含まれている場合、逆シーケンス化されると問題が発生する可能性があります.この問題を克服するために、巧みなテクニックはbase 64_を使うことです.encodeとbase 64_decode.
しかしbase 64符号化は文字列の長さを増加させる.この問題を克服するためにgzcompressと併用できます.
2. json_encodeとjson_decode
JSON形式のシーケンス化と逆シーケンス化を使用するのは良い選択です. jsonを使用encodeとjson_decodeフォーマットの出力はserializeとunserializeフォーマットよりずっと速いです. JSON形式は読み取り可能です. JSON形式はserializeよりデータを返す結果が小さい. JSON形式はオープンで移植可能です.他の言語でも使用できます.
上記の例ではjson_Encode出力長は、前の例のserialize出力長よりも明らかに短い.
3. var_义齿
var_export関数は変数を文字列として出力します.evalは文字列をPHPコードとして実行し,最初の変数の内容を逆シーケンス化する.
4. wddx_serialize_valueとwddx deserialize
wddx_serialize_value関数は配列変数をシーケンス化し、XML文字列として出力できます.
XMLタグ文字が多く,このフォーマットのシーケンス化には多くの空間が占められていることがわかる.
小結
上記のすべての関数は配列変数をシーケンス化する際に正常に実行できるが,オブジェクトに適用すると異なる.例えばjson_encodeシーケンス化オブジェクトは失敗します.オブジェクトを逆シーケンス化すると、unserializeとevalは異なる効果を得ます.
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形式のシーケンス化と逆シーケンス化を使用するのは良い選択です.
$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は異なる効果を得ます.