Como posso armazenar objects em uma session em PHP?

Olá, eu gostaria de armazenar ou salvar um object dentro de uma session, usando classs como SessionHandler ou arrays $ _SESSION, eu vi que é possível se eu serializar o object e não quero perder os methods desse object instância … Eu vi seriedade, é possível, mas os objects que eu quero armazenar são criados pelo PDOStatement :: fetchObject (), embora a class de instância seja “Usuários” Eu recebo esse erro:

PDOException: Você não pode serializar ou desmarcar instâncias PDO Por quê? Não é uma instância PDO …

Desculpe, eu sou espanhol e não falo inglês muito bem .. Obrigado

As sessões nativas de $_SESSION do PHP, de forma transparente, serializam e desmarquecem objects que suportam o protocolo de serialização do PHP ou a interface Serializable . Você não precisa serializá-los explicitamente.

O PHP não pode serializar resources porque estes são identificadores para algum recurso com estado fora do controle do PHP. É por isso que você não pode serializar objects PDO ou PDOStatement .

Por padrão, um object é serializado, salvando todos os nomes e valores de propriedade e desmarcado criando um object com a mesma class (sem invocar o construtor) e definindo diretamente as propriedades serializadas. Você pode personalizar o comportamento de serialização para seus objects usando os methods mágicos __sleep e __wakeup ou implementando a interface Serializable . Mas não os dois! Se você usar implements Serializable , __sleep e __wakeup são ignorados.

Uma nota importante: ao usar serialização de object, você deve ter a definição de class carregada antes de desmarcar (ou ter um carregador automático que pode carregá-la) e deve corresponder à definição de class do object que foi serializado. As definições de class não são armazenadas nos dados serializados.

Por exemplo, suponha que você tenha o seguinte:

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

Agora imagine que você mude o Test um dia para ser assim:

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

Agora suponha que você carregue no seu novo código um object serializado quando o Test foi na versão 1:

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

Você obterá isso:

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

Além disso, você não pode usar methods antigos:

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