PHP5のオブジェクト指向プログラミングのなかで、"__wakeup()"と"__sleep()"という特殊関数があります。これはオブジェクトをシリアル化したり非シリアル化する時に自動的に呼び出される、ということなのですが、そもそも「シリアル化」とはいったいなんなのでしょうか?
また、それを使うのはどんなメリットがあるのでしょうか?
いろいろ調べたのですが、「シリアル化」というのを前提にして話が進んでいる場合が多くていまいちわからないので、誰か教えてくれませんか?
コメント

- 3:pola
- 2007/08/13 22:59
hasekenさん、詳細なご返答ありがとうございます。こんな機能があったとは知りませんでした。ではフォームでデータを渡す時など、シリアル化するとセキュリティ的にもよいんでしょうか。hiddenだとソース表示でコードが見えてしまいますよね。

- 4:haseken
- 2007/08/14 11:30
serialize()を使った文字列をhidden要素に埋め込んでも、一目見て分からなくするくらいの効果しかありません。
PHPを使ってunserialize()関数を通してしまえば中身が見れてしまうので、少し手間を掛ければ見えてしまいます。
セキュリティ上、外に出すのが危険なデータは、セッション上で管理するか、md5()関数で暗号化したものを使った方が良いと思います。
ただ、md5を使って暗号化したデータは元に戻すことが出来ないので、元のデータとの検証方法を別に考えないといけませんが・・・。
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。








シリアル化とは、オブジェクトや配列など、複雑なデータ構造を持つものを、一つの文字列として扱うことが出来る形に変換し、必要な時に、それを元に戻すことが出来る機能です。
=> 復元可能な文字列 => Array(1,2,3)
例えば、フォームのhidden要素ににデータを埋め込む時、配列のデータを埋め込もうとすると「Array」と言う文字列が入ってしまいます。
そこでserialize()関数を使い、配列を復元可能な文字列にして埋め込みます。
そして、フォームの行き先のPHPスクリプトで文字列として受け取ったデータをunserialize()関数で元に戻すと、元の配列が受け取れます。
また、SESSIONにオブジェクトを格納する際は必ずserialize()関数でシリアル化することをお勧めします。
オブジェクトにはメソッドがあるのですが、シリアル化せずにSESSIONに入れた場合、そのオブジェクトのメソッドを使おうとするとエラー又は警告が出る場合があります。
理由は、SESSIONにデータを格納する際、オブジェクトは単なるデータの集まりに変換され、メソッドの構造までは保存されません。
SESSIONから取り出した時点でメソッドがどのクラスのどのメソッドか分からないので、エラーが発生します。
シリアル化をするとクラス含めメソッドの構造も保存してくれるので、エラーを回避することが出来ます。
※イメージ
Array(1,2,3)