Hatena::ブログ(Diary)

130単位

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()
  • json_encode() / json_decode()
    • PHP 5.2.0以降で利用可能
    • JavaScriptでそのまま使える
    • 配列の階層が深くなると処理が落ちる

利用環境が5.2.0以降で確定しているのならば、JSON形式を使うのが良さそうな気がします。

wtnabewtnabe 2008/10/12 08:29 素朴な疑問なのですが、プロパティしかないオブジェクトというのは連想配列じゃダメなんでしょうか? なんかその方が面倒がないような気がするんですが。

deeekideeeki 2008/10/12 09:47 個人的には連想配列で問題ないかと思っています^^;
フレームワークの設計上、オブジェクトを使っています。どうしてそういう設計なのかについては、またちょっと調べてみます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20081011/objectserialize