__serialize e __unserialize
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 49 de 91.
Quando você precisa converter um objeto em uma string para armazenamento ou transmissão, o PHP usa serialização. Os métodos mágicos __serialize() e __unserialize() dão a você controle sobre exatamente quais dados são salvos e como eles são restaurados.
O método __serialize() retorna um array de dados a serem serializados, enquanto __unserialize() recebe esse array e reconstrói o objeto:
<?php
class Session {
public function __construct(
private string $userId,
private array $data,
private int $createdAt
) {}
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}
public function getCreatedAt(): int {
return $this->createdAt;
}
}
$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);
$restored = unserialize($serialized);
echo "User: " . $restored->getCreatedAt();
Observe como createdAt é excluído da serialização e recebe um novo timestamp quando desserializado. Isso é útil para excluir dados sensíveis, valores temporários ou recursos que não podem ser serializados, como conexões de banco de dados.
Estes métodos substituíram os antigos métodos __sleep() e __wakeup() no PHP 7.4, oferecendo uma abordagem mais limpa onde você trabalha diretamente com arrays de dados em vez de nomes de propriedades.
Desafio
FácilVamos construir um sistema de cache de perfil de usuário que demonstra como __serialize() e __unserialize() oferecem controle sobre quais dados são salvos e como são restaurados.
Você organizará seu código em dois arquivos:
UserProfile.php— Crie uma classeUserProfileque represente o perfil de um usuário com recursos de cache. Use a promoção de construtor para definir propriedades privadas para$userId(string),$username(string),$email(string) e$accessToken(string). Adicione uma propriedade privada$cachedAtque armazena quando o perfil foi colocado em cache (defina-a como"not cached"inicialmente no construtor). Sua classe precisa de:__serialize()— Retorna um array contendo apenas ouserId,usernameeemail. OaccessTokené sensível e nunca deve ser serializado. O timestampcachedAtserá regenerado na restauração.__unserialize()— Restaura ouserId,usernameeemaila partir do array de dados. DefineaccessTokencomo"expired"(já que os tokens não devem persistir).getInfo()— Retorna uma string no formato:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php— Inclua o arquivo UserProfile. Você receberá quatro entradas: um ID de usuário, um nome de usuário, um e-mail e um token de acesso. Crie uma instância deUserProfilecom esses valores. Imprima três linhas:- As informações do perfil original (antes da serialização)
- Serialize o perfil usando
serialize(), depois desserialize-o usandounserialize()para criar um perfil restaurado. Imprima as informações do perfil restaurado. - Imprima
"Token preserved: yes"ou"Token preserved: no"dependendo se o token do perfil restaurado corresponde ao original (dica: não deve corresponder, pois os tokens expiram na restauração)
Este padrão é essencial para armazenar dados de usuário em cache com segurança — você deseja armazenar as informações do perfil, mas nunca persistir credenciais sensíveis como tokens de acesso. Quando o perfil é restaurado do cache, o token é marcado como expirado, forçando o aplicativo a obter um novo.
Folha de consulta
Os métodos mágicos __serialize() e __unserialize() controlam quais dados são salvos durante a serialização e como os objetos são restaurados.
__serialize() retorna um array de dados a serem serializados:
<?php
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}__unserialize() recebe o array e reconstrói o objeto:
<?php
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}Use serialize() para converter um objeto em uma string e unserialize() para restaurá-lo:
<?php
$serialized = serialize($session);
$restored = unserialize($serialized);Esses métodos são úteis para excluir dados sensíveis, valores temporários ou recursos que não podem ser serializados (como conexões de banco de dados). As propriedades podem ser regeneradas com valores novos durante a desserialização.
Experimente você mesmo
<?php
require_once 'UserProfile.php';
// Ler entradas
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: Criar uma instância de UserProfile com os valores de entrada
// TODO: Imprimir as informações do perfil original (antes da serialização)
// TODO: Serializar o perfil e, em seguida, desserializá-lo para criar um perfil restaurado
// TODO: Imprimir as informações do perfil restaurado
// TODO: Imprimir "Token preserved: yes" ou "Token preserved: no"
// dependendo se o token do perfil restaurado corresponde ao original
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy