На днях отлаживал простенький 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 и объект очищался, но в конструкторе при следующем запуске данные вновь доставались из сессии.