プロが教える店舗&オフィスのセキュリティ対策術

 phpを勉強中の一アルバイトプログラマです.いろいろ弄くってみてよくわからないところがあるのですが,ひとつ質問させていただきたいと思います.

 あるページから,別のページへオブジェクトを引き渡したいと思いました.一度ブラウザを終了しても引き続いて扱えるようにしたいと思っていたので,cookieを使って次のようにすることにしました.

a.php:
$obj = new ClassA();
setCookie( "cookie", serialize($obj), mktime("2010/8/1 00:00:00") );

 マニュアルによるとserializeしたオブジェクトはプロパティの値しか保存されない,ということですので,勝手に推測して,

b.php:
$obj = (ClassA)unserialize($cookie);

 としたところ,b.phpでparse errorが起こります.どうやらphpではクラス間のキャストができなさそうだ,というのはわかりますが,そうすると,処理の流れの中で一貫してひとつのオブジェクトを扱いたい場合,どのようにすればよいのでしょうか?.

 ・・・家に帰ってきてから気が付いたのですが,オブジェクトをserializeしたstringには,クラス名の情報が含まれているようです.ということは,ひょっとしてクラス定義さえきっちりしておけばunserializeしたオブジェクトもきちんとクラスのインスタンスとしてあつかえるのか?.

A 回答 (2件)

serialize() はバイトストリーム表現を含むとある(→参考URL)ので、


きちんと cookie に保存されていないのではないかなあ。

base64encode() してから cookie に保存する、というのはどうでしょう?

勿論、unserialize() する前には、base64decode()ね。

参考URL:http://uk.php.net/manual/ja/function.serialize.php

この回答への補足

 すみません,言葉足らずだったかもしれません.質問の意味がうまく伝わっていないようですが・・・.

 a-kumaさんのおっしゃる問題はまた別に発生するかもしれませんが,とりあえず,

 serialize() → Cookie → unserialize()

 という過程は正常に終了したとして,unserialize()で返ってきたオブジェクトを,きちんとClassA型として扱いたい(メソッド起動などを行いたい)のだが,どうすればいいのだろうか,というのが疑問点でした.

 というのも,serialize()では,オブジェクトのプロパティは保存されるが,メソッドは保存されない,とphpのリファレンスに明記してあるからです.
 今日はバイトのほうには出ていないので,前記の例でb.php側にClassAの定義がある場合についてはまだ実験していませんが・・・・.



 関係のない話ですが,phpのクラスって,同じクラス内のメソッドを呼び出すにはどうしたらいいんですか?.

 this->function_name();

 ってやると,「そんな関数は知らん.」(多分そんな感じ)って言われるんですが・・・.

補足日時:2001/04/13 13:53
    • good
    • 0
この回答へのお礼

 迅速なご返事ありがとうございます.まだ,続きでいろいろ聞くかもしれませんが,よろしくお願いします.

お礼日時:2001/04/13 14:05

> きちんとClassA型として扱いたい(メソッド起動などを行いたい)の


  ...
> メソッドは保存されない,とphpのリファレンスに明記してある

ああ、そうですね。

クラス宣言は別のファイルに書き出して、require でとりこむしか
ないですね。

で、メンバーの数だけ、代入を繰り返すか、メンバー複写用のメソッドを
定義しておく。

require 'class_a.inc';

$obj_saved = unserialize($cookie);
$obj = new ClassA();

$obj->copy_from($obj_saved);



> this->function_name();

$this->function_name ではないかな。

http://www.zuien.or.jp/develop/ja-manual/php3/oo …

この回答への補足

 ご回答ありがとうございます.

> クラス宣言は別のファイルに書き出して、require でとりこむしか
> ないですね。

 これはやっております.

> で、メンバーの数だけ、代入を繰り返すか、メンバー複写用のメソッドを
> 定義しておく。

 うーん,やっぱそうなりますか.そんなにたいしたコードではないと思うので,やってみます.それから,

> > this->function_name();
>
> $this->function_name ではないかな。

 す,すみません.極めて初歩的ミスのようで・・・.申し訳ありませんでした.

補足日時:2001/04/13 20:23
    • good
    • 0
この回答へのお礼

 丁寧なご回答,本当にありがとうございます.今回の経験を生かして,次からはもう少しうまく質問したいと思います.
 ありがとうございます.

お礼日時:2001/04/13 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!