Как я могу хранить объекты в сессии в 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()"
}