PHP对象Singleton无法正常工作

时间:2009-12-03 16:46:31

标签: php object singleton

我正在用PHP编写网站后端,我需要将$ _SESSION封装在一个类中。 我已经使我的Session类成为单例,但我在使用它时遇到了麻烦。

class Session
{

    private static $instance;

    public static $sessionID;

      private function __construct()
      {
          session_start();
          self::$sessionID = session_id();
      }

      public function Session() {
          return Session::singleton();
      }

      public static function singleton()
      {
          if (!isset(Session::$instance)) {
              Session::$instance = new Session();
          }

          return Session::$instance;
      }

      public function destroy()
      {
          foreach ($_SESSION as $var => $val) {
              $_SESSION[$var] = null;
          }

          session_destroy();
      }

      public function __clone()
      {
          trigger_error('Clone is not allowed for '.__CLASS__,E_USER_ERROR);
      }

      public function __get($var)
      {
          return $_SESSION[$var];
      }

      public function __set($var,$val)
      {
          return ($_SESSION[$var] = $val);
      }

      public function __destruct()
      {
          session_write_close();
      }

      public function exist( $var ) {
        return isset($_SESSION[ $var ]);
      }

 }

95%的时间都可以正常工作。但偶尔我会调用var_dump(Session::singleton());

输出:object(Session)#2 (0) { }

在我看来,它显然是我的Session类的另一个实例,但我不确切地知道它是如何可能的。

非常感谢!

2 个答案:

答案 0 :(得分:2)

尝试删除公共构造函数(只保留私有构造函数)

  public function Session() {
      return Session::singleton();
  }

我不是百分之百确定会这样做但是公共构造函数不遵守Singleton模式

答案 1 :(得分:1)

'#2'(在'object(Session)'之后)不是Session类的实例数,但它是php创建的下一个对象数。如果你得到#2,你似乎已经创建了某些东西(对象)。 我测试过你的类,当我运行“var_dump(Session :: singleton());” 我得到:“对象(会话)#1(0){}” 但是当我在脚本结束时运行它 我得到(例如):“object(Session)#31(0){}”

此致