2011-06-23 51 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; 
    } 
} 

最後一個函數檢查數據成員($ s_insntance),如果是NULL它創建一個對象,並把它扔了回來管理活動相關的沿創建一個新的會話。

如果數據成員不爲空,它將返回現有對象。

或者在理論上,這是它應該做的。但是,每次訪問新頁面並調用s_getinstance函數時,都會嘗試創建一個全新的對象,並且舊數據丟失。請幫我在這裏。

+0

加些適當的縮進,使你的代碼可讀性? – ThiefMaster

+0

*(相關)* [誰需要單身人士](http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323)和[清潔代碼會談](http://www.youtube。 com/watch?v = -FRm3VPhseI) – Gordon

+1

'public static $ s_instance = NULL;''您的實例可以從**任何地方改變**! –

回答

6

我們在這裏沒有看到的是您將會話對象的內容保存到$_SESSION。如果不這樣做,它無法在頁面加載時持續存在。

您需要一種方法來會話實例保存到PHP $_SESSION,然後你s_getinstance()需要檢查是否已經存在於$_SESSION並從那裏檢索,或從存儲器檢索它,或者從頭開始創建它,如果它不」任何地方都存在。

Start reading here...(PHP的會話處理文檔)

// 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 ...進行比較以運行新的「main」。一切都失去了。將東西存儲在'$ _SESSION'中可以避免這種情況! – SteeveDroz

+0

好吧,我會嘗試將對象存儲在會話中。這很奇怪,但我重新啓動了電腦,突然間一切正常。背景中有一些未定義的有趣業務正在進行。我會盡你所能地做。再次感謝。 – captainspi

+0

此外,我公開讓調試更容易。別擔心,我不會接受這段代碼。 – captainspi