2008-10-11
PHPでオブジェクトをセッションへ格納するには
PetitworkというPHPのフレームワークでは、値の受け渡しの際などにValueObject*1を主に使っています。で、それをセッションに格納しようとして、試したり調べてみたりしたメモ。
そのまま格納すると
まず、そのままではセッションに格納はできるのですが、読み込んだあとにうまく扱えません。var_dumpで中を覗いてみると、「__PHP_Incomplete_Class」とでます。値も確認できるのですが、アクセスしようとするとNULLが返ってきてしまいます。どうやらセッション開始前にクラス定義がされていないとだめらしいです。
PHP: オブジェクトのシリアル化 - セッションでのオブジェクト - Manual http://php.benscom.com/manual/ja/language.oop.serialization.php あーありがち - __PHP_Incomplete_Class を防ぐ富豪アプローチ http://aligach.net/diary/20070426.html オブジェクトのシリアル化 - え〜ちゃんのブログ http://a-chan.com/blog/2008/02/post.html
シリアル化
というわけで、クラス定義をしないで汎用的に扱うには、シリアル化(serialize())してから格納しないといけません。読み込んだあとにunserialize()してやれば、普通に使うことが可能になります。
と、ここで頭に浮かんだのが、似たようなかたちでJSON形式に変換する「json_encode() / json_decode()」の存在。実際に試してみたところ、問題なく動作しました。
ではseriarize()とjson_encode()では、どちらを使ったらいいのでしょうか。ググってみたら、そのものずばりの記事がでてきました。
zuzara : PHP5.2.0でserialize()とjson_encode()はどちらが速いのか http://blog.zuzara.com/2006/12/22/175/
「結論としては速度はほぼ同じ。」とのことです。ただし留意点もあったりするので、詳しくは元記事をご確認ください。
シリアル化比較
調べた情報をもとに、それぞれ特徴をまとめると以下のようになるかと思います。
- serialize() / unserialize()
- PHP 4以降で利用可能
- JavaScriptで使うにはライブラリが必要っぽい*2
- 配列の階層が深くなっても処理が落ちない(けど時間はかかる)
- json_encode() / json_decode()
- PHP 5.2.0以降で利用可能
- JavaScriptでそのまま使える
- 配列の階層が深くなると処理が落ちる
利用環境が5.2.0以降で確定しているのならば、JSON形式を使うのが良さそうな気がします。
トラックバック - http://d.hatena.ne.jp/deeeki/20081011/objectserialize
リンク元
- 11 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=q0&q=PHP セッション 値 連想配列に格納&btnG=%
- 9 http://www.google.co.jp/search?q=php+セッション シリアル化&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 8 http://search.yahoo.co.jp/search?p=セッション オブジェクト格納&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 7 http://www.google.co.jp/search?hl=ja&q=php+セッション+格納&lr=&aq=f&oq=
- 6 http://search.yahoo.co.jp/search?p=PHP+セッションに格納&ei=UTF-8&fr=top_ga1&x=wrt
- 6 http://www.google.co.jp/search?q=セッションに格納 php&sourceid=navclient-ff&ie=UTF-8&rlz=1B5GGGL_jaJP300JP300
- 5 http://www.google.co.jp/search?hl=ja&q=php+オブジェクト 格納&lr=
- 4 http://shiro9211.jugem.jp/
- 4 http://www.google.co.jp/search?q=__PHP_Incomplete_Class&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 4 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=PHP+セッションに情報を格納



