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したオブジェクトもきちんとクラスのインスタンスとしてあつかえるのか?.
No.2ベストアンサー
- 回答日時:
> きちんと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 ではないかな。
す,すみません.極めて初歩的ミスのようで・・・.申し訳ありませんでした.
丁寧なご回答,本当にありがとうございます.今回の経験を生かして,次からはもう少しうまく質問したいと思います.
ありがとうございます.
No.1
- 回答日時:
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();
ってやると,「そんな関数は知らん.」(多分そんな感じ)って言われるんですが・・・.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- PHP クラス 1 2022/08/08 15:12
- Illustrator(イラストレーター) Illustratorでオブジェクトの色が勝手に変わって困っています。 4 2022/09/04 18:47
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- Visual Basic(VBA) クラス デフォルトプロパティの作り方 1 2022/10/23 11:41
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列とオブジェクトの違い
-
phpのクラスメソッドの定義が長...
-
「クラス関数」「メンバ関数」...
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
拡張子php画像をjpg画像等に変...
-
PHPとCSVで簡易データベースな...
-
include先でのinclude元の変数...
-
リダイレクト元のURLの取得方法...
-
メールフォームのタイトルが文...
-
php エラー
-
PHPのif文でその処理を途中で抜...
-
VBでメールを送る時のSMT...
-
one drive のアップロード失敗...
-
別PHPファイルに変数を渡す
-
ワードプレスサイト PHP8.0.25...
-
パースエラーとは?
-
Image Magickの関数が使えない
-
文字化けで混乱中です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
ラッパークラスって何ですか?
-
'_'(アンダースコア)の使い方...
-
class定義のphpをファイル分割...
-
配列とオブジェクトの違い
-
PHP4、PHP5 1ファイル複数クラ...
-
関数定義の関数名の前にある&(...
-
php、可変プロパティ名について
-
クラス設計の良い参考書を教え...
-
phpのクラスにて別ファイルの変...
-
class.upload.phpの戻り値(返...
-
【PHP】クラス と 関数 の違い
-
php インスタンスとオブジェク...
-
Re: Cookieを使ってオブジェク...
-
PHPでサブクラスからスーパクラ...
-
クラス
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
おすすめ情報