2011-06-23 7 views
1

私はここでイライラしている。私は、シングルトンオブジェクトを利用する認証システム(ゼロから構築)を持っています。PHP Singletonオブジェクトが消えますか?

シングルトンオブジェクトは、基本的にセッションのセキュリティを管理し、セッションハイジャックやその他の悪意のあるアクティビティに対して安全な機能を備えています。

これらの機能はメンバーデータによって異なります。

ここで問題は、PHPがこれらのシングルトンオブジェクトを破棄して、ユーザーが新しいページをリフレッシュまたは移動するたびに破棄されるようになってしまうことです。

ここ

は、セッションクラスのプロトタイプです:

class session extends login{ 
    public $sessionid; 
    private $fingerprint; 
    public static $temp=0; 
    public static $s_instance = NULL; 

    public static function s_getinstance(){ 

     if (!isset(session::$s_instance) || !isset(session::$sessionid)) { 
      $c = __CLASS__; 
      if(isset(session::$s_instance)) { 
       session::$s_instance = 0; 
      } 

      session::$s_instance = new $c; 
      self::regenerate_id_name();      
      self::$temp +=1;     
     } 

     return session::$s_instance; 
    } 
} 

最後の機能は、それがNULLであれば、それはオブジェクトを作成し、関連活動を管理するとともに、それをバック投げ、データメンバ($のs_insntance)をチェック新しいセッションを作成することになります。

データメンバーがnullでない場合は、既存のオブジェクトを返します。

または理論的には、それはやるべきことです。しかし、新しいページにアクセスしてs_getinstance関数を呼び出すたびに、何らかの理由で新しいオブジェクトを作成しようとし、古いデータが失われます。ここで私を助けてください。

+0

いくつかの適切なインデントについてのあなたのコードが読みやすくするためには何? – ThiefMaster

+0

*(関連)* [シングルトンが必要な人](http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323)と[The Clean Code Talks](http://www.youtube。 – Gordon

+1

'public static $ s_instance = NULL;' ..あなたのインスタンスは**どこからでも**変更できます! –

答えて

6

ここに表示されていないものは、いつでもセッションオブジェクトの内容を$_SESSIONに保存します。そうすることなく、ページの読み込みを超えて持続することはできません。

あなたは既に存在する場合は$_SESSIONにチェックして、そこからそれを取得、またはメモリから取得、またはそれはdoesnの場合は、最初からそれを作成するために、あなたのs_getinstance()ニーズをPHP $_SESSIONにセッションのインスタンスを保存してする方法を必要としますどこにも存在しない。

Start reading here...(PHPセッションハンドリングのDocs)

// assuming you've already called session_start()... 
public function storeinstance() 
{ 
    $_SESSION['session'] = self::s_getinstance(); 
} 

public static function s_getinstance(){ 

    if (!isset(session::$s_instance) || !isset(session::$sessionid)) { 
     $c = __CLASS__; 

     // Check if it's already sitting in $_SESSION 
     // Load it from $_SESSION if it's there, and then unset the $_SESSION var 
     if (!isset(session::$s_instance) && isset($_SESSION['session'])) { 
      session::$s_instance = $_SESSION['session']; 
      unset($_SESSION['session']); 
     } 
     else if(isset(session::$s_instance)) { 
      session::$s_instance = 0; 
     } 

     session::$s_instance = new $c; 
     self::regenerate_id_name();      
     self::$temp +=1;     
    } 

    return session::$s_instance; 
} 
+1

つまり、ユーザーが新しいページを読み込んだり、現在のページを読み込んだりするたびに、(C/C++、Javaなどで)新しい「メイン」を実行することと比較することができます。すべてが失われます。 '$ _SESSION'に物事を格納することはそれを防ぎます! – SteeveDroz

+0

申し訳ありませんが、セッションにオブジェクトを格納しようとします。これは奇妙ですが、私はPCを再起動し、突然すべてが動いています。背景には未定義のビジネスがあります。あなたの言うとおりに私はやります。再度、感謝します。 – captainspi

+0

また、デバッグを簡単にするために公開しました。心配しないで、私はこのコードで生きていくつもりはない。 – captainspi

関連する問題