PHP

Хранение данных в сессии

На днях отлаживал простенький php-класс для хранения небольшого объема данных в сессии. Столкнулся с граблями и долго не мог перестать бить себя черенком по лбу. Удовольствие то еще, поэтому вкратце изложу суть, надеюсь помогу тем самым вам не тупить в таком же моменте, плюс класс можно взять за базу для аналогичной задачи.

Задача: пополнять и очищать наш стек в процессе выполнения программы, сохранять в сессию все данные на момент завершения программы.

class Storage
{
  public $items;
  private $storage;
  
  public function __construct()
  {
      $this->storage = array();
      if (isset($_SESSION['items']))
      {
          $this->storage = $_SESSION['items'];
      }
  }

}


В конструкторе проверяем, хранится ли что-то в нужном нам массиве $_SESSION, и если что-то есть, записываем это в данные объекта.

Напишем метод добавления данных и деструктор.

public function add($item)
{
  $this->storage[] = $item;
}

function __destruct()
{
  if (count($this->storage)) $_SESSION['items'] = $this->storage;
  else $_SESSION['items'] = array();
  print_r($_SESSION);
}


В деструкторе соответственно записываем в сессию то, что находится в объекте на момент завершения работы программы.

Теперь напишем метод очистки нашего объекта от данных. Это то место, где я и наступил на грабли.

function clear()
{
  $_SESSION['items'] = array();
  return new Storage;
}


Вроде все прозрачно, НО:

$obj = new Storage;
$obj->add('userName');
$obj = $obj->clear();


При вызове метода clear() первоначально созданный объект разрушается, а соответственно срабатывает деструктор. А ошибка заключалась в том, что в деструторе не обрабатывался вариант пустого свойства storage и объект очищался, но в конструкторе при следующем запуске данные вновь доставались из сессии.
Теги:
SESSION, сессия
Добавлено: 01 Марта 2015 10:00:41 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...