Home > PHP > PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2)

PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2)

  • 2010-12-02 (木) 14:30
  • PHP
この記事の所要時間: 559

今年(2010年)は、日本でも技術系コミュニティのAdvent Calendarが流行していますね。

PHP関連だとCakePHP(明日書きます!)やSymfonyOpenPNEなどはあるのですが、PHP単体が無かったので作ってみました。

PHP Advent Calendar jp 2010

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さん、よろしくお願いします!

Pocket

follow us in feedly

トラックバック: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

Home > PHP > PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2)

検索
フィード
メタ情報

Return to page top