- ベストアンサー
SESSIONとGLOBALSとCLASSについて
- A.phpでクラスをグローバル変数に代入し、それをセッションに登録し、B.phpで取り出すことは可能でしょうか?取り出し方がわからない場合はどうすればよいでしょうか?
- A.phpではクラスをグローバル変数に代入し、それをセッションに登録します。B.phpでセッションからクラスを取り出す方法がわからない場合は、別の方法を教えてください。
- A.phpでクラスをグローバル変数に代入し、それをセッションに登録し、B.phpでクラスを取り出すことはできるのでしょうか?取り出し方がわからない場合は、他の方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
オブジェクトのままセッションに格納することも出来ますよ。 その場合は自動的に文字列に変換/文字列から復元されます。 注意点 (1) PHPで一般的に用いられる「serialize」「unserialize」関数 セッションの管理に使われる「session_encode」「session_decode」関数 これらは全くの別物です。 (2) オブジェクトを格納した場合、 他のファイルでsession_start関数をコールする前に 必ず「require_once」等でクラス定義の情報を読み込む必要があります。 session_startの "前に" というのがミソです。 【XXX.php】 <?php class XXX { ____ ____private $data; ____ ____public function __construct($data) { ________$this->data = $data; ____} ____ ____public function getData($data) { ________return $this->data; ____} ____ } 【a.php】 <?php require_once('XXX.php'); session_start(); $_SESSION['xxx'] = new XXX('test'); /* $instance = new XXX('test'); $_SESSION['xxx'] = $instance; としても全く同じ意味 (オブジェクトの代入は自動的に参照になるため) */ 【b.php】 <?php require_once('XXX.php'); session_start(); if (!isset($_SESSION['xxx'])) { ____echo 'No Object'; } else { ____echo $_SESSION['xxx']->getData(); }
その他の回答 (2)
- mpro-gram
- ベストアンサー率74% (170/228)
serialize 関数で オブジェクトの現在プロパティ値を一連の文字列にすれば、$_SESSION配列にも保持出来ます。格納元変数がローカルか global かには関係ない。 unserialize するには、クラス定義が必要ですので、自前で作ったクラスなら require_once class_file は必須 http://jp.php.net/manual/ja/language.oop5.serialization.php
include http://www.php.net/manual/ja/function.include.php require、include_once、require_onceもチェック。
お礼
原因がわかりましたので ご報告させてください。 ■OK $_SESSION['XXX'] = new XXX_CLASS(); $_SESSION['XXX']->setdata('abc'); ■NG $xxx = new XXX_CLASS(); $xxx->setdata('abc'); $_SESSION['XXX'] = $xxx; といったようになるようです。 サーバーはロリポップを使用しています。 設定の問題なのかな。と思いつつこの件はクローズしたいと思います。 ご丁寧にありがとうございました!
補足
To_aru_User様 ご回答ありがとうございます。 さっそく、試みたのですが、以下のようなエラーとなります、、、 Fatal error: Call to a member function getData() on a non-object in 通常の変数でセッション受け渡し⇒OK クラスのセッション受け渡し ⇒NG もちろん、includeは実施しています。 原因としてはなんでしょうか。。。