Я работаю над веб-приложением, которое позволяет пользователям войти в систему и назначить экзамен, назначенный администратором. У меня есть функция «накапливать», которая должна запускаться автоматически после того, как все пользователи закончат тестирование и обновят базу данных (согласно некоторой логике).
Я знаю, что могу использовать базу данных, чтобы сохранить хранилище пользователей, которые проводят тестирование, и, соответственно, запустить логику, но мне интересно знать, может ли это сделать одноэлементный класс.
Мой код:
class ScoreBoard{
var $current;
private static $board=NULL;
// private static $current=0;
private function __construct() {
$this->current=0;
}
static function scoreboard(){
if(!self::$board){
self::$board= new ScoreBoard();
$this->log("Created new");
// return self::$board;
}
return self::$board;
}
function add(){
$this->current+=1;
$this->log("add ".$this->current);
}
function subtract(){
$this->current-=1;
$this->log("subtract ".$this->current);
// file_put_contents("scoreboard.txt",self::$current);
if($this->current<0)
$this->current=0;
if($this->current<=0)
{
$this->accumulate();
self::$board=NULL;
}
}
}
И в startExam.php
файл я вызываю эту функцию как:
$scoreboard= ScoreBoard::scoreboard();
$scoreboard->add();
И делать
$scoreboard= ScoreBoard::scoreboard();
$scoreboard->subtract();
когда экзамен заканчивается. Таким образом, когда каждый пользователь начинает экзамен, одиночные объекты add
функция должна быть вызвана, и когда он заканчивает subtract
функция должна быть вызвана. Но это не работает по какой-то причине, и $current
никогда не увеличивается за пределы 1.
Пожалуйста, дайте мне знать, возможно ли то, что я пытаюсь сделать, или нет. И если есть какие-то лучшие способы добиться того, что я хочу сделать. Спасибо.
Вы могли бы использовать Memcached
для достижения этой цели —
Ваша функция конструктора будет выглядеть примерно так:
$this->memcache = new Memcached();
$this->memcache->addServer("127.0.0.1", "11211") // I think that's the right port for default.
$this->current = $this->memcache->get("current");
Но вы можете сделать ту же логику, сохранив значение в файле — и это будет проще …
Других решений пока нет …