Serialização de objetos em PHP: funções, métodos e exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Serialização de objetos em PHP: guia completo



Serialização é o processo de converter estruturas de dados complexas (objetos, arrays) em uma string ou formato binário que pode ser salvo em um arquivo, transmitido pela rede ou armazenado em cache. Em PHP, esse mecanismo é implementado pelas funções internas serialize() e unserialize(). Neste artigo, vamos detalhar como funciona a serialização de objetos, quais armadilhas existem e como usar métodos mágicos para ajustar o processo.



Funções principais de serialização



O PHP fornece duas funções-chave para trabalhar com serialização:



  • serialize($value) — converte um valor (exceto resource) em uma string adequada para armazenamento. Para objetos, o nome da classe e todas as propriedades (incluindo privadas e protegidas) são preservados.
  • unserialize($string) — restaura o valor original a partir de uma string. Para objetos, o construtor da classe é chamado automaticamente (se definido) e as propriedades salvas são atribuídas.


Exemplo simples de serialização de objeto



Vamos considerar uma classe básica User e sua serialização:



<?phpclass User {    public $name;    public $email;    private $password;

public function __construct($name, $email, $password) { $this->name = $name; $this->email = $email; $this->password = $password; }}

$user = new User('João', 'joao@example.com', 'segredo123');$serialized = serialize($user);echo $serialized;// Saída: O:4:"User":3:{s:4:"name";s:8:"João";s:5:"email";s:16:"joao@example.com";s:12:"\\0User\\0password";s:9:"segredo123";}?>


Observe: a propriedade privada $password aparece na string como \\0User\\0password — esta é uma notação especial para campos privados, onde \\0 é o byte nulo.



Restaurando um objeto a partir de uma string serializada



<?php$serialized = 'O:4:"User":3:{s:4:"name";s:8:"João";s:5:"email";s:16:"joao@example.com";s:12:"\\0User\\0password";s:9:"segredo123";}';$user = unserialize($serialized);echo $user->name; // Joãoecho $user->email; // joao@example.com// A propriedade privada password também foi restaurada, mas não está diretamente acessível?>


Importante: Ao desserializar, o PHP tenta carregar a classe se ela ainda não foi definida. Se a classe não existir, uma instância da classe interna __PHP_Incomplete_Class será criada.



Métodos mágicos __sleep() e __wakeup()



Para controlar o processo de serialização, o PHP fornece dois métodos mágicos:



  • __sleep() — chamado antes da serialização. Deve retornar um array com os nomes das propriedades a serem serializadas. Útil para fechar conexões com banco de dados, liberar recursos ou ocultar dados confidenciais.
  • __wakeup() — chamado imediatamente após a desserialização. Usado para reconectar ao banco de dados, restaurar recursos ou verificar a integridade dos dados.


Exemplo com __sleep() e __wakeup()



<?phpclass DatabaseConnection {    private $host;    private $user;    private $password;    private $connection;

public function __construct($host, $user, $password) { $this->host = $host; $this->user = $user; $this->password = $password; $this->connect(); }

private function connect() { // Simulação de conexão $this->connection = "Recurso de conexão a {$this->host}"; }

public function __sleep() { // Não serializa o recurso de conexão, apenas os dados para reconexão return ['host', 'user', 'password']; }

public function __wakeup() { // Restaura

Recommendations