在我的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
并且每次使用不同值的新实例时,我都会获取令牌的问题每次都会使令牌无效。
我该怎么办?
答案 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);