Как я могу хранить объекты в сессии в PHP?
Здравствуйте я хотел бы сохранить или сохранить объект внутри сеанса, используя классы, такие как SessionHandler или arrays $_SESSION,я видел,что это возможно, если я сериализую объект, и я не хочу терять методы этого экземпляра объекта.. Я видел, что сериализация возможна, но объекты, которые я хочу сохранить, создаются PDOStatement:: fetchObject (), хотя класс экземпляра - "пользователи", я получаю эту ошибку:
PDOException: нельзя сериализовать или отменить сериализацию ПДО экземпляры Почему? Это не экземпляр PDO..
Извините, я испанский, и я не очень хорошо говорю по-английски.. Спасибо
1 ответов
родной PHP $_SESSION
сеансы прозрачно объекты сериализовать и восстановить что поддержки в 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()"
}