PHP синглтон объект исчезает? - PullRequest
1 голос
/ 23 июня 2011

Я застрял в расстроенной колее. У меня есть система аутентификации (построенная с нуля), которая использует одноэлементный объект.

Объект 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, он создает объект и возвращает его вместе с управлением действиями, связанными с созданием нового сеанса.

Если элемент данных не равен NULL, он возвращает существующий объект.

Или теоретически это то, что он должен делать. Однако каждый раз, когда я захожу на новую страницу и вызываю функцию s_getinstance, она по какой-то причине пытается создать новый объект, и старые данные теряются. Пожалуйста, помогите мне здесь.

1 Ответ

6 голосов
/ 23 июня 2011

Здесь мы не видим, что в любой момент вы сохраняете содержимое объекта сеанса в $_SESSION. Без этого он не может сохраняться при загрузке страницы.

Вам нужен метод для сохранения экземпляра сеанса в PHP $_SESSION, а затем ваш s_getinstance() должен проверить, существует ли уже в $_SESSION и извлечь его оттуда, или извлечь его из памяти, или создать его из поцарапайте, если его нигде не существует.

Начните читать здесь ... (Документы по обработке сеансов 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...