PHP - 单例全局实例

时间:2014-01-07 09:24:46

标签: php singleton

在我的PHP项目中,我创建了一个单人课程来管理我的访问令牌 标记是一些常量字符串,时间戳为+/- 5分钟,用SHA1进行散列 我希望每个页面都可以访问这个单一实例(同一个实例),因为它拥有令牌。还有一个程序可以在该实例中刷新令牌。
名称TokenManager位于不同的php文件中 我在不同的文件中创建了实例$TOKENS

<?php

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

另一个用于刷新操作的文件(refreshTokens.php):

<?php

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

在另一个网页服务(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 个答案:

答案 0 :(得分:1)

当一个被调用的PHP脚本结束时,所有对象都被销毁,单例类在这里对你没有帮助。

单个类可以在一次页面调用的整个运行时期间用作缓存或存储。

换句话说,单独的单例实例无法在脚本调用之间保留数据。

将它们保存在会话中,文件或数据库中。

@Edit:在讨论了我们提出的问题后,最好使用类常量,我在这里给你一个例子:

@ Edit2:反思讨论,如果你做的正确,单身人士课很好,我在这里给你举个例子:

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);