PHP Singleton对象消失了吗?

cap*_*spi 1 php singleton

我在这里陷入了令人沮丧的困境.我有一个使用单例对象的身份验证系统(从头开始构建).

单例对象基本上管理会话的安全性,并具有防止会话劫持和其他恶意活动的功能.

这些功能取决于成员数据.

现在的问题是,每次用户刷新或移动到新页面时,PHP似乎都会丢弃这些单例对象.

这是sessions类的原型:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个函数检查数据成员($ s_insntance),如果它为NULL,则它创建一个对象并将其抛回,同时管理与创建新会话相关的活动.

如果数据成员不为null,则返回现有对象.

或者从理论上讲,这就是应该做的事情.但是,每次访问新页面并调用s_getinstance函数时,它都会尝试根据某种原因创建一个全新的对象,旧数据将丢失.请帮帮我.

Mic*_*ski 6

我们在这里看不到的是你在什么时候将会话对象的内容保存到$_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;
}
Run Code Online (Sandbox Code Playgroud)