Serialize/Unserializeを試してみる
Using Serialized PHP with Yahoo! Web Servicesが出てからちょっと話題になっているSerializeまわり。
とりあえずPHPにおける変数のSerializeについてよく知らんのでやってみる。
<?php $array = array("key" => "val"); $int = 10; $string = "string"; $object = new MyClass(); print serialize($array); print "\n"; print serialize($int); print "\n"; print serialize($string); print "\n"; print serialize($object); class MyClass{ var $mem; function MyClass() { $this->mem = "initial value"; } } ?>
以下が実行結果。型と長さを情報として持っているんですね。どうやらaがarrayで、iがinteger、sがstringでOがObjectの模様。
a:1:{s:3:"key";s:3:"val";} i:10; s:6:"string"; O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}
で、こいつをunserializeで復元してみる。
<?php $s_array = 'a:1:{s:3:"key";s:3:"val";}'; $s_int = 'i:10'; $s_string = 's:6:"string"'; $s_object = 'O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}'; print_r(unserialize($s_array)); print "\n"; print unserialize($s_int); print "\n"; print unserialize($s_string); print "\n"; var_dump(unserialize($s_object)); ?>
実行結果
Array ( [key] => val ) string object(__PHP_Incomplete_Class)(2) { ["__PHP_Incomplete_Class_Name"]=> string(7) "myclass" ["mem"]=> string(13) "initial value" }
おお。元に戻った?*1
でも、このままではIncomplete_Classなので、ちゃんとクラスも書いておかないとだめ。
<?php $s_array = 'a:1:{s:3:"key";s:3:"val";}'; $s_int = 'i:10'; $s_string = 's:6:"string"'; $s_object = 'O:7:"myclass":1:{s:3:"mem";s:13:"initial value";}'; print_r(unserialize($s_array)); print "\n"; print unserialize($s_int); print "\n"; print unserialize($s_string); print "\n"; var_dump(unserialize($s_object)); class MyClass{ var $mem; function MyClass() { $this->mem = "initial value"; } } ?>
そしたら実行結果はこうなりました。
Array ( [key] => val ) string object(myclass)(1) { ["mem"]=> string(13) "initial value" }
これで、
$obj = unserialize($s_object); print $obj->mem;
とすればメンバ変数も扱える。
なるほどー。
今度はXMLをこの形にしてみる予定。
PEAR::XML_Serializerを使うらしいよ。
*1:あれっ?!integerが元に戻っていない・・・