- 2010-12-02 (木) 14:30
- PHP
今年(2010年)は、日本でも技術系コミュニティのAdvent Calendarが流行していますね。
PHP関連だとCakePHP(明日書きます!)やSymfony、OpenPNEなどはあるのですが、PHP単体が無かったので作ってみました。
Advent Calendarについては、下記リンクが詳しいです。これを書いている段階では、まだ参加枠があるので、どんどん参加して下さい。みんなのちょっとしたPHPネタを書いていきましょう!
というわけで、まず初回(12/2に始めたので、Day1は空席で)のネタは、最近自分の中で流行中のPHPのシリアライズデータ(serialize()/unserialize())について。
シリアライズデータのデータ型
CakePHPのセキュリティホール発覚以降、一部で脚光を浴びたPHPのシリアライズなのですが、シリアライズデータで表現できるデータ型をあらためて調べてみました。
まあPHPのソース見れば一目瞭然ですね。
[ext/standard/var_unserializer.c]
437 case 'C': 438 case 'O': goto yy13; 439 case 'N': goto yy5; 440 case 'R': goto yy2; 441 case 'S': goto yy10; 442 case 'a': goto yy11; 443 case 'b': goto yy6; 444 case 'd': goto yy8; 445 case 'i': goto yy7; 446 case 'o': goto yy12; 447 case 'r': goto yy4; 448 case 's': goto yy9;
ざっくり読んだ感じでは以下な内容でしょうか。
C=CustomObject O=Object N=NULL R=Reference S=string a=array b=boolean d=double i=integer o=Objectっぽいけどなんだろ? r=Reference s=string
シリアライズデータで表現してみる
‘b’ = boolean
boolean(論理型)です。
b:の後ろの数値は、1ならtrue、それ以外ならfalseになるようです。
b:1; => bool(true) b:0; => bool(false)
‘i’ = integer
integer(整数型)です。
i:100; => int(100)
‘d’ = double/float
double/float(浮動小数点数)です。
d:10.123; =>float(10.123)
‘s’ / ‘S’ = string
string(文字列)です。’s’と’S’の違いはよく分かってないのですが、文字列をserialize()すると’s’になります。
s(S):の後ろが文字列のバイト数で、””で文字列を囲みます。
s:3:"abc"; => string(3) "abc" S:3:"abc"; => string(3) "abc" s:9:"頑張る"; => string(9) "頑張る"(UTF-8)
‘N’ => NULL
NULLです。
N; => NULL
‘a’ => array
array(配列)です。
a:の後ろは要素数です。あとは添え字、要素によって様々な形式を記載します。
a:2:{s:3:"1st";i:100;s:3:"2nd";i:200;}; => array(2) { ["1st"]=> int(100) ["2nd"]=> int(200) }
‘C’ / ‘O’ / ‘o’=Custom Object / Object / Object?
クラスインスタンス(オブジェクト)です。通常インスタンスをserialize()すれば、’O’となります。
O:3:"Foo":1:{s:4:"var1";s:3:"abc";}
‘C’は、シリアライズする対象クラスがSerializableをimplementしている時に付与されます。この場合、シリアライズ、デシリアライズ処理は、PHPデフォルトの処理ではなく、対象クラスのserialize/unserializeメソッドで定義された処理が実行されます。
serializeメソッドではシリアライズしたデータをreturnします。unserializeメソッドでは、シリアライズしたデータが引数で渡されるのでそれをパースしてインスタンス変数にセットします。
C:3:"Foo":29:{a:1:{s:6:"value1";s:3:"abc";}}
‘o’は、内部的にはインスタンスを復元するようなのですが、具体的にどのように記載すれば良いかまだ分かってません><
‘r’ / ‘R’ = Reference
Reference(参照)です。’r’(小文字)と’R’(大文字)でデシリアライズした時の挙動が変わります。
‘R’の場合は、参照型としてデシリアライズされます。
a:2:{s:3:"1st";i:100;s:3:"2nd";R:2;}; => array(2) { ["1st"]=> &int(100) ["2nd"]=> &int(100) }
‘r’の場合は、変数に参照先の値がセットされますが、参照型にはなりません。
a:2:{s:3:"1st";i:100;s:3:"2nd";r:2;}; => array(2) { ["1st"]=> int(100) ["2nd"]=> int(100) }
参照型変数をシリアライズした際は、参照先の変数も一緒にシリアライズされれば’R’に、参照先変数がシリアライズデータに含まれていなければ、参照先の値がセットされます。(’r’は?)
リソース型やクロージャはNG
リソース型やクロージャは標準のserialize()ではシリアライズできません。
シリアライズデータは見れば分かる
シリアライズデータで身近なのは、セッションデータだと思うのですが、一見複雑そうなシリアライズデータでも開いてみると実は結構読めます。何より変数値はほぼそのまま入っているので、なんとなくでも内容を掴むことができます。
PHPユーザならシリアライズデータを読むことは普通だと思うのですが、初日ということでBasicなネタにしてみました。
では、明日のikeekiさん、よろしくお願いします!
- Newer: CakePHP Modelとの付き合い方(CakePHP Advent Calendar 2010 3日目)
- Older: PHP unserialize()が__destruct()を実行する?
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2010/12/php_serialize_data_type.html/trackback
- Listed below are links to weblogs that reference
- PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2) from Shin x blog