2009-12-03 40 views
0

我在PHP中编写网站后端,我需要在类中封装$ _SESSION。 我已经让我的Session类成为单例,但我无法使用它。PHP对象单例不工作

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%的时间。但是occasionnaly当调用var_dump(Session::singleton());

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

在我看来,很明显,它使我的会话类的其他实例,但我看不出它究竟是如何是可能的。

非常感谢!

回答

2

尝试删除公共构造(只留一个私人)

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

我不是100%肯定会做到这一点,但有一个公共的构造不符合Singleton模式

+0

是的,没有理由在那里。代码与PHP4不兼容,所以没有理由拥有PHP4风格的构造函数。 – 2009-12-03 17:00:27

+0

谢谢,我会删除它,但它只在那里出于修复原因。另一个网站建议编写来解决这个问题。 问题仍然存在。 – Duguigne 2009-12-03 17:15:00

1

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

Regards