重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ご教授お願いいたします。
以下のこういったことは可能でしょうか?

■質問
「A.php」で
クラスをグローバル変数に代入し、それをセッションに登録し、「B.php」で取り出すことは可能でしょうか。

⇒可能な場合
 「B.php」でどうやって取り出せばよいでしょうか。

⇒不可能な場合
 「A.php」から「B.php」へクラスを渡したいのですが、どうすればよいでしょうか?


■例
「A.php」というソースで
クラスをグローバル変数に代入し、セッションに代入する。

○例(A.php):
$xxc = new XXX_XXX_CLASS();
$xxc->setA('aaa');
$GLOBALS['@XXX_XXX_CLASS'] = $xxc;
session_start();
// セッションにセット
$_SESSION['aaa'] = $GLOBALS['@XXX_XXX_CLASS'];
// セッションのクローズ
session_write_close();

○例(B.php):
session_start();

取り出し方:1
$xxc = $_SESSION["aaa"]; // ←取り出せなかった。
$xxc->getA();

取り出し方:2
$xxc = new XXX_XXX_CLASS();
$xxc = $_SESSION["aaa"]; // ←取り出せなかった。
$xxc->getA();

取り出し方:3
ほかに取り出し方がありましたらご教授お願いいたします。

グローバル変数を通さないやり方もしてみたのですが、そちらでも出来ませんでした。
以上、よろしくお願いいたします。

A 回答 (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();
}

この回答への補足

To_aru_User様

ご回答ありがとうございます。
さっそく、試みたのですが、以下のようなエラーとなります、、、

Fatal error: Call to a member function getData() on a non-object in

通常の変数でセッション受け渡し⇒OK
クラスのセッション受け渡し  ⇒NG

もちろん、includeは実施しています。

原因としてはなんでしょうか。。。

補足日時:2013/10/30 10:20
    • good
    • 0
この回答へのお礼

原因がわかりましたので
ご報告させてください。

■OK
$_SESSION['XXX'] = new XXX_CLASS();
$_SESSION['XXX']->setdata('abc');

■NG
$xxx = new XXX_CLASS();
$xxx->setdata('abc');
$_SESSION['XXX'] = $xxx;

といったようになるようです。
サーバーはロリポップを使用しています。
設定の問題なのかな。と思いつつこの件はクローズしたいと思います。

ご丁寧にありがとうございました!

お礼日時:2013/10/30 10:35

serialize 関数で オブジェクトの現在プロパティ値を一連の文字列にすれば、$_SESSION配列にも保持出来ます。

格納元変数がローカルか global かには関係ない。
unserialize するには、クラス定義が必要ですので、自前で作ったクラスなら require_once class_file は必須
http://jp.php.net/manual/ja/language.oop5.serial …
    • good
    • 0

include


http://www.php.net/manual/ja/function.include.php

require、include_once、require_onceもチェック。
    • good
    • 0

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