Привет, я хотел бы сохранить или сохранить объект внутри сеанса, используя классы, такие как SessionHandler или массивы $ _SESSION, я видел, что это возможно, если я сериализую объект, и я не хочу терять методы этого объекта экземпляр. Я видел, что серализация возможна, но объекты, которые я хочу сохранить, создаются PDOStatement :: fetchObject (), хотя класс экземпляра – это «Пользователи». Я получаю эту ошибку:
PDOException: вы не можете сериализовать или unserialize экземпляры PDO Почему? Это не экземпляр PDO.
- ClassNotFoundException: Попытка загрузить класс «Mongo» из ... (с сохранением) symfony2
- Есть ли способ в PHP использовать постоянные данные, как в Java EE? (обмен объектами между потоками PHP) без сеанса и кэша / DB
- Резидентное решение RESTful, используемое с backbone.js ... в PHP?
- Невозможно передать значение параметра в репозиторий findOneBy Symfony
- Сохранять объекты в REST API вместо DB с помощью Doctrine 2
Извините, что я испанский, и я не очень хорошо говорю по-английски .. Спасибо
Собственные сеансы $_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()" }