2014-01-07 48 views
0

在我的PHP項目中,我創建了一個管理我的訪問令牌的singletone類。
令牌是一些恆定的字符串,時間戳爲+/- 5分鐘,與SHA1散列。
我希望每個頁面都可以訪問這個singletone實例(同一個實例),因爲它擁有這些標記。在這種情況下也會有一個刷新令牌的過程。
名稱TokenManager位於不同的php文件中。
我在不同的文件中創建實例$TOKENSPHP - singletone全局實例

<?php 

require_once 'TokenManager.php'; 
$TOKENS = TokenManager::Instance(); 

而對於刷新動作(refreshTokens.php)其他文件:

<?php 

require_once 'Tokens.php'; 
global $TOKENS; 
$TOKENS->refreshTokens(); 
var_dump($TOKENS->tokens); 

在另一頁是一個Web服務(AddUser)我用這個Tokens.php實例作爲全球。

require_once 'TokenManager.php'; 
    require_once 'Tokens.php'; 
................................... 
    function start(){ 
     global $userParams; 
     global $TOKENS; 
     //Check for all mandatory params 
     if(!ValidateParams()){ 
      finish(); 
     } 

     if(!$TOKENS->checkTokenAndGetChannel($userParams[PARAM_TOKEN])){ 
      setError(ERR6_BAD_TOKEN, CODE6_DESC); 
      finish(); 
     } 

     if(!isEmailValidByDrupal($userParams[PARAM_EMAIL])){ 
      setError(ERR3_BAD_EMAIL, CODE3_DESC . $userParams[PARAM_EMAIL]); 
      finish(); 
     } 

     finish(); 
    } 

,每次我打電話refreshTokens.php,並採取令牌我每次有新的實例與不同的價值觀是什麼讓每一次的令牌無效的問題。

我該怎麼辦?

回答

1

那麼當一個被調用的PHP腳本結束時,所有的對象都會被銷燬,而一個單例類在這裏並不能真正幫到你。

在一個頁面調用的整個運行時期間,單例類可以用作緩存或存儲。

換句話說,單獨實例本身不能保持腳本調用之間的數據。

將它們保存在會話中,文件或數據庫中。

@Edit:在討論我們提出了這是最好使用類常量的問題後,我介紹你在這裏一個例子:

@ EDIT2:重新思考討論和Singleton類是好的,如果你這樣做正確的,我在這裏留下你一個例子:

final class Tokens { 
    static private $instance = null; 
    private $tokens = array(); 

    static public function getInstance() { 
     if(self::$instance === null) { 
      self::$instance = new self(); 
      self::$instance->initialize(); 
     } 
     return self::$instance; 
    } 

    private function initialize() { 
     $this->tokens[] = "erhdfhegrtoken1!"; 
     $this->tokens[] = "4h43gherhtoken2!"; 
     $this->tokens[] = "egegtoken3!"; 
    } 

    public function getToken($index) { 
     $retVal = ""; 

     if(isset($this->tokens[$index])) { 
      $retVal = $this->tokens[$index]; 
     } 

     return $retVal; 
    } 

    private function __construct() { } 
    private function __clone() { } 
} 

用法:

$tokens = Tokens::getInstance(); 
$myToken = $tokens->getToken(2); 
+0

如果我把它保存在Session是它會針對不同的用戶保存實例? – NickF

+0

如果保存在會話中,爲什麼它對於不同的用戶應該是相同的?每個用戶都有自己獨特的會話! –

+0

沒有馬克所說,這將是很好的唯一的問題是你保存它是多餘的,你應該考慮如果你真的希望我認爲數據庫表是更好的選擇。這對未來也很靈活,如果你想改變你的令牌或任何下一個... – Steini