2012-01-16 9 views
0

PHPでカスタムセッションハンドラを実装する際に問題があります。dbを使用したPHPのカスタムセッションハンドラ

require_once 'DbSession.php'; 
$session = new DbSession(); 
session_start(); 

しかし、その後、私は私のページを表示することはできません: コード:私は、DBとの接続を持っていた後 http://pastebin.com/9QV9f22Q

私は私のフレームワークに一度これを初期化するには、ブートストラップ。 Firefoxは302ステータスを「サーバーが見つかりません」というエラーで取得します。 Firebugによると、コンテンツの長さは5kですが、私はそのページを見ることができません。

ログは1つのリロード後:それはまだDbSessionインスタンスを作成している「失う」なぜ http://pastebin.com/JYe14nGR

のだろうか。どんなアイデアがありますか? TIA

答えて

0

あなたのコードは、と異なるオブジェクトをPHPコンストラクタから返すことができるという偽の前提に基づいています。正反対です:PHP は、コンストラクタからの戻り値を完全に無視します()。

ここで実際に何が起こっているのですか。

あなたのコードが呼び出されます:

$session = new DbSession(); 

$firstTime == falseチェックを実行すると、getInstance()の意味が呼び出されます。

getInstance既存のインスタンスが見つからないため、setup()を呼び出します。

setup()もう一度この引数を渡して、別の呼び出しをgetInstance()にするのを防ぎます。オブジェクトを作成し、それをセッションハンドラとして登録して返します。

getInstanceは、オブジェクトを静的変数に格納してから、元のコンストラクタ呼び出しに戻します。オリジナルのコンストラクタコールは、地面にある既存のオブジェクトをドロップし、新しいものを返します。

setup/getInstance()の外部にオブジェクトをインスタンス化しないことで、この狂気のを修正できます。コンストラクタをprotectedにして、getInstance()を呼び出してみてください。

しかし、これが原因でコードが誤動作している理由については説明していません。実際、それについても説明することはできません。 すべての残りのコード、どのデータベースアダプタを使用しているか、使用しているORM(がORMを使用してであっても、クラスとメソッド名が示唆します)、whatフレームワークが関与している可能性があります。

お試しください。実際のデータベースのすべてをクラスから削除してください。ディスクにファイルを書き込むだけです。まず、にしてから、データベースレイヤーを導入してください。その時点でエラーが明らかになる可能性があります。

関連する問題