Forum und email

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 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 {
      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");
  
fwrite($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.