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()" }