PHP объект Singleton не работает - PullRequest
0 голосов
/ 03 декабря 2009

Я программирую серверную часть сайта на 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 ]

2 голосов
/ 03 декабря 2009

Попробуйте удалить публичный конструктор (оставив только приватный)

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

Я не уверен на 100%, что это будет делать, но наличие открытого конструктора не соответствует шаблону Singleton

1 голос
/ 03 декабря 2009

'# 2' (после 'object (Session)') - это не номер экземпляра класса Session, а следующий номер объекта, созданного php. Если Вы получаете № 2, кажется, что Вы создали что-то (объект) раньше. Я проверил Ваш класс и когда я запускаю "var_dump (Session :: singleton ());" Я получаю: "объект (сеанс) # 1 (0) {}" но когда я запускаю его в конце скрипта Я получаю (например): "object (Session) # 31 (0) {}"

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...