PHP Singleton对象消失了吗?

时间:2011-06-23 12:39:32

标签: php 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 个答案:

答案 0 :(得分:6)

我们在此处未看到的是,您将会话对象的内容保存到$_SESSION中。如果不这样做,它就无法在页面加载中持续存在。

您需要一种方法将会话实例保存到PHP $_SESSION中,然后您的s_getinstance()需要检查$_SESSION中是否已存在并从那里检索它,或从中检索它内存,或者如果它在任何地方都不存在,则从头开始创建。

Start reading here...(有关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;
}