__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 a serialização. Os métodos mágicos __serialize() e __unserialize() permitem controlar exatamente quais dados são salvos e como 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 "Created at: " . $restored->getCreatedAt();
Observe como createdAt é excluído da serialização e recebe um novo registro de data e hora quando é desserializado. Isso é útil para excluir dados confidenciais, valores temporários ou recursos que não podem ser serializados, como conexões com bancos de dados.
Esses métodos substituíram os métodos mais antigos __sleep() e __wakeup() no PHP 7.4, oferecendo uma abordagem mais limpa, na qual você trabalha diretamente com arrays de dados em vez de nomes de propriedades.
Desafio
FácilVamos criar um sistema de cache de perfil de usuário que demonstra como __serialize() e __unserialize() dão a você controle sobre quais dados são salvos e como eles 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 propriedades no construtor para definir propriedades privadas para$userId(string),$username(string),$email(string) e$accessToken(string). Adicione uma propriedade privada$cachedAtque armazene quando o perfil foi colocado em cache (defina-a como"not cached"inicialmente no construtor). Sua classe precisa de:__serialize(): Retorna um array contendo apenasuserId,usernameeemail. OaccessTokené sensível e nunca deve ser serializado. O timestamp decachedAtserá regenerado durante a restauração.__unserialize(): RestaurauserId,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()e, em seguida, desserialize-o usandounserialize()para criar um perfil restaurado. Imprima as informações do perfil restaurado. - Imprima
"Token preserved: yes"ou"Token preserved: no", dependendo de o token do perfil restaurado corresponder ao original (dica: ele não deve corresponder, pois os tokens expiram durante a restauração)
Esse padrão é essencial para armazenar dados de usuários em cache com segurança. Você quer 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 a aplicação a obter um novo.
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: Print "Token preserved: yes" or "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 OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da 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 às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem 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 NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre 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 StrategyPratique por conta própria: Compilador de PHP online