PHP: Serializando uma maneira simples

 

PHP: Serializando uma maneira simples

Os desenvolvedores php odeiam isso!

Italo Baeza Cabrera
1 de julho de 2019 · 4 min de leitura
Foto de Ghis em Unsplash

Uma das partes tingidamente sobre salvar a instância de uma classe é serializar. Para quem não sabe o que diabos é isso, o conceito é muito simples: você pode representar uma instância de uma classe como uma corda,para que você possa armazenar em qualquer lugar, e depois restaurar a instância a partir dessa mesma string.

Isso é feito automaticamente dentro do PHP quando você usa os métodos e , usando a instância de classe, e a representação de sequência de caracteres de classe, respectivamente:serialize($instance)unserialize($string)

$car = new Car(new OilEngine());FileHandler::set('class.txt', serialize($car));$sameCar = unserialize(FileHandler::get('class.txt'));

Isso é muito útil para armazenar instâncias para recuperação posterior, como arquivos interno, bancos de dados, em lojas de memória (como redis ou memcached), ou apenas qualquer coisa que aceite texto.

Por exemplo, salvar uma instância de classe do Usuário com suas propriedades em uma Sessão, para que depois que isso seja recuperado na próxima solicitação, podemos restaurar a mesma instância do Usuário sem ter que retirá-la do Banco de Dados. Ei, é só um exemplo.

A velha maneira de lidar com a serialização

Antes do PHP 5.1, a única maneira de lidar com a serialização das aulas era utilizando os métodos e .__sleep()__wakeup()

O primeiro deve retornar uma matriz de propriedades que devem ser serializadas, entre outras profundas "limpeza", antes de passar a instância para o processo de serialização padrão do PHP. O outro seria chamado após a classe não ser esterilizada, o que permitiria modificar a instância atual para restaurar o que foi perdido.

simples? Não por um tiro no escuro. Além disso, existem algumas ressalvas ao usar a serialização padrão:

  • A string é difícil de entender à primeira vista, já que php usa uma codificação estranha para manter a forma de Classe.
  • Você tem que levar em conta que as propriedades da instância de classe também são serializáveis ou não, e ter um trabalho para restaurá-los na não-setorialização.

Como você pode ver, eles parecem contraproducentes e confusos, mas desde PHP 5.1 não há mais necessidade de levá-los em conta, já que há uma maneira muito, muito melhor de lidar com a serialização.

Bem-vindo Serializable!

PHP tem uma interface útil chamada Serializable. Este contém dois métodos que você deve definir, chamados e , e eles substituem as chamadas antigas sem quebrar a compatibilidade para trás.serialize()unserialize()

Eles são praticamente autoexplicativos, mas em qualquer caso, aqui a essência:

  • serialize() é chamado quando a classe está sendo serializada. Seu objetivo é passar uma representação de sequência da Classe para PHP. Por exemplo, podemos apenas retornar uma lista de atributos codificados por JSON. O nome da classe é anexado automaticamente com a sequência devolvida, sem o último, PHP não saberá para qual classe não seerizar mais tarde.
  • unserialize() é chamado quando a sequência está sendo não serizada para a classe correspondente.PHP verificará o nome da classe na sequência serializada, passará a sequência para este método e definirá o que a instância de classe precisar.

O método é complicado de entender à primeira vista, mas não vacilar. Como diz a documentação,esse método age como um "construtor", ou seja, a classe será instância contornando o método. Se você precisar de algumas dependências definidas no método deserialização terá que procurá-las manualmente ou (de preferência) defini-las quando a serialização for feita:unserialize()__construct()_contruct()

$car = unserialize(FileHandler::get('class.txt'));$car->setWheels(new Wheels());
$car->setPaintJob(new PaintJob('red'));

Para definir as dependências, uma boa maneira é usar setters na instância de classe não serializada usando a ajuda dos 's e dos's, se você precisar de algo mais avançado e modular.ReflectionClassgetConstructor()ReflectionMethodgetParameters()

Mas estamos avançando. Vamos serializar alguma coisa.

Serializando e deseralizando um carro

Você não baixaria um carro? Ainda não, mas podemos salvá-lo em um arquivo. Uma simples olhada nesta classe "Carro" e você notará que ele precisa de um Motor, oferecemos uma propriedade estilo PHP 7.4 para definir a cor, e ele tem métodos de serialização já definidos.

Quando serializar, ele vai fazê-lo como JSON. Nessa sequência, colocaremos o nome da classe Engine, se o motor está ligado, e a cor.

Quando não se sobreserializar,vamos decodificar a sequência JSON. Vamos criar um novo motor a partir do nome de classe dado, colocar a cor, e ligar o motor se ele foi iniciado.

Vamos verificar em ação.

voilà. Não há necessidade de fazer sh*t estranho em seu código para salvar uma instância classe. Inferno, você poderia até mesmo salvá-los em um pendrive e deserializá-los em outro computador. Tecnologia!

Palavra de conselho: você não pode serializar Fechamentos, principalmente porque estes têm um contexto fora da Classe. É como receber uma conta para pagar, mas não saber para quem. mas... se você precisar dessa funcionalidade, o pacote SuperClosure pode ser para você.

Comentários

Postagens mais visitadas deste blog

Jogo da velha em C

Java Web Start

Calcular distancia entre dois pontos google maps