Как хранить объекты в сеансе в PHP?

Привет, я хотел бы сохранить или сохранить объект внутри сеанса, используя классы, такие как SessionHandler или массивы $ _SESSION, я видел, что это возможно, если я сериализую объект, и я не хочу терять методы этого объекта экземпляр. Я видел, что серализация возможна, но объекты, которые я хочу сохранить, создаются PDOStatement :: fetchObject (), хотя класс экземпляра – это «Пользователи». Я получаю эту ошибку:

PDOException: вы не можете сериализовать или unserialize экземпляры PDO Почему? Это не экземпляр PDO.

Извините, что я испанский, и я не очень хорошо говорю по-английски .. Спасибо

Собственные сеансы $_SESSION PHP прозрачно сериализуют и неэтериализуют объекты, которые поддерживают протокол сериализации PHP или интерфейс Serializable . Вам не нужно явно их сериализовывать.

PHP не может сериализовать resources поскольку они обрабатывают некоторый ресурс, зависящий от состояния, за пределами контроля PHP. Вот почему вы не можете сериализовать объекты PDO или PDOStatement .

По умолчанию объект сериализуется путем сохранения всех имен и значений свойств и неэтериализованных путем создания объекта с тем же классом (без вызова конструктора) и непосредственного задания сериализованных свойств. Вы можете настроить поведение сериализации для своих объектов с помощью методов магии __sleep и __wakeup или путем реализации интерфейса Serializable . Но не оба! Если вы используете implements Serializable , __sleep и __wakeup игнорируются.

Одно важное замечание: при использовании сериализации объектов вы должны иметь определение класса, загруженное до того, как вы несериализуете (или имеете автозагрузчик, который может его загрузить), и он должен соответствовать определению класса объекта, который был сериализован. Определения классов не хранятся в сериализованных данных.

Например, предположим, что у вас есть следующее:

 class Test { public $version = 1; protected $abc; public function setAbc($abc) { $this->abc = $abc; } } $t = new Test(); $t->setAbc(123); $_SESSION['mytest'] = $t; 

Теперь представьте, что вы меняете Test один день, чтобы быть похожим на это:

 class Test { public $version = 2; private $def; public function setDef ($def) { $this->def = $def; } } 

Теперь предположим, что вы загружаете в свой новый код объект, сериализованный, когда Test был в версии 1:

 $t = $_SESSION['mytest']; // this was stored yesterday, when Test was version 1 var_dump($t) 

Вы получите следующее:

 object(Test)#1 (3) { ["version"]=> int(1) ["def":"Test":private]=> NULL ["abc":protected]=> int(123) } 

Кроме того, вы не можете использовать старые методы:

 if ($t->version == 1) { // Check for class version $t->setAbc(345); // "Fatal error: Call to undefined method Test::setAbc()" }