Manual do PHP
Anterior | Capítulo 18. Classes e Objetos | Próxima

# Serializando objetos - objetos em sessões

> Nota: No PHP 3, objetos perdem suas associações entre classes através do processo de serialização e desserialização. A variável resultante é do tipo objeto, mas sem classe nem métodos, algo bem sem utilidade (de fato, ele se torna apenas um array com uma sintaxe engraçada).

Cuidado
As informações seguintes se aplicam somente ao PHP 4.

serialize() retorna uma string contendo uma representação linear de qualquer valor que pode ser armazenado no PHP. unserialize() pode ser utilizado para recriar os valores da variável original. Usando serialize para salvar um objeto irá preservar todas as variáveis de um objeto. As funções de um objeto não serão salvas, apenas o nome da classe.

Para ser possível fazer o unserialize() de um objeto, a classe do objeto precisa estar definida. Ou seja, se você tem um objeto $a da classe A em page1.php e o serializa, você consegue uma string que se refere a classe A e contém todos os valores de variáveis contidos em $a. Se você precisa desserializa-la em page2.php, recriando $a da classe A, a definição da classe A precisa estar presente na page2.php. Isto pode por ser feito, por exemplo, armazenando a definição da classe A em um arquivo separado, incluindo este arquivo e ambos os arquivos page1.php e page2.php.

`<?php // classe_a.inc.php: class A { var $um = 1; function mostre_um() { echo $this->um; } } // page1.php: include("classe_a.inc.php"); $a = new A; $s = serialize($a); // armazena $s em algum lugar que page2,php possa encontra-la $fp = fopen("armazenamento", "w"); fputs($fp, $s); fclose($fp); // page2.php: // Isto e preciso para que unserialize funcione normalmente include("classe_a.inc.php"); $s = implode("", @file("armazenamento")); $a = unserialize($s); // Agora podemos usar a funcao mostre_um() do objeto $a $a->mostre_um(); ?>`

Se você está utilizando sessões e usar session_register() para registrar objetos, esses objetos serão serializados automaticamente no final de cada script PHP, e automaticamente desserializados em cada uma das páginas seguintes. Isto significa que esse objetos podem estar em qualquer uma de suas páginas desde que elas sejam parte de sua sessão.

É extremamente recomendável que você inclua as definições de classe de todos os objetos registrados de todas as suas páginas, mesmo que você não use essas classes em todas as suas páginas. Se você não o fizer e um objeto for desserializado sem sua definição de classe presente, ele perde usa associação com a classe e se torna um objeto da classe stdClass, sem qualquer funções disponíveis. o que as deixa silenciosamente sem funcionalidade.

Assim, se no exemplo acima $a se tornar parte de uma sessão pela utilização de session_register("a"), você precisa incluir o arquivo classe_a.inc.php em todos as suas páginas, não somente em page1.php e page2.php.

Anterior | Principal | Próxima
parent | Acima | As funções mágicas __sleep e __wakeup