Serializar PHP

Resumo : neste tutorial, você aprenderá como usar a serialize()função PHP para serializar um objeto.

Introdução à função serialize() do PHP

Para serializar um objeto em uma string , você usa a serialize()função:

serialize(mixed $value): stringLinguagem de código:  PHP  ( php )

A serialize()função retorna uma string que contém uma representação de fluxo de bytes do objeto. E você pode armazenar essa string em um armazenamento, como um arquivo ou banco de dados.

Por exemplo, o seguinte define a Customerclasse:

<?php

class Customer
{

    private $id;

    private $name;

    private $email;

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

    public function getInitial()
    {
        if ($this->name !== '') {
            return strtoupper(substr($this->name, 0, 1));
        }
    }
}Linguagem de código:  PHP  ( php )

E isso ilustra como usar a serialize()função para serializar um Customerobjeto:

<?php

require 'Customer.php';

$customer = new Customer(10, 'John Doe', '[email protected]');
$str = serialize($customer);

var_dump($str);Linguagem de código:  PHP  ( php )

Saída:

string(132) "O:8:"Customer":3:{s:12:"Customerid";i:10;s:14:"Customername";s:8:"John Doe";s:15:"Customeremail";s:20:"[email protected]";}"Linguagem de código:  PHP  ( php )

Observe que a serialize()função serializa apenas as propriedades do objeto, não o método.

O exemplo a seguir serializa um Customerobjeto e salva a string em um arquivo:

<?php

require 'Customer.php';

$customer = new Customer(10, 'John Doe', '[email protected]');
$str = serialize($customer);

file_put_contents('customer.dat', $str);Linguagem de código:  PHP  ( php )

O __sleep()método mágico

A serialize()função verifica se a classe implementa o __sleep()método. Nesse caso, ele executará o __sleep()método antes de serializar o objeto.

public __sleep(): arrayLinguagem de código:  PHP  ( php )

O __sleep()método retorna um array que contém nomes de propriedades que serão serializadas.

Se o __sleep()método não retornar nada, a serialize()função serializará o valor nulo e emitirá um arquivo E_NOTICE.

O exemplo a seguir ilustra como implementar o __sleep()método:

<?php

class Customer
{
    private $id;
    private $name;
    private $email;

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

    public function getInitial()
    {
        if ($this->name !== '') {
            return strtoupper(substr($this->name, 0, 1));
        }
    }

    public function __sleep(): array
    {
        return ['id', 'name'];
    }
}Linguagem de código:  PHP  ( php )

Neste exemplo, o __sleep()método retorna um array que contém os nomes das propriedades id e name. E a serialize()função serializará apenas os valores destas propriedades:

<?php

require 'Customer.php';

$customer = new Customer(10, 'John Doe', '[email protected]');
$str = serialize($customer);

var_dump($str);Linguagem de código:  PHP  ( php )

Saída:

string(81) "O:8:"Customer":2:{s:12:"Customerid";i:10;s:14:"Customername";s:8:"John Doe";}"Linguagem de código:  PHP  ( php )

Na prática, você desejaria criptografar informações confidenciais, como e-mail e números de cartão de crédito, antes de realizar a serialização.

O __serialize()método mágico

O __serialize()método é semelhante ao __sleep()método:

public __serialize(): arrayLinguagem de código:  PHP  ( php )

No entanto, o __serialize()método retorna uma matriz associativa de pares chave/valor que representa a forma serializada do objeto.

Além disso, se o __serialize()método não retornar um array, o PHP lançará um arquivo TypeError.

Por exemplo:

<?php

class Customer
{
    private $id;

    private $name;

    private $email;

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

    public function getInitial()
    {
        if ($this->name !== '') {
            return strtoupper(substr($this->name, 0, 1));
        }
    }

    public function __serialize(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
        ];
    }
}Linguagem de código:  PHP  ( php )

O seguinte ilustra como usar a serialize()função para serializar um Customerobjeto:

<?php

require 'Customer.php';

$customer = new Customer(10, 'John Doe', '[email protected]');
$str = serialize($customer);

var_dump($str);Linguagem de código:  PHP  ( php )

Se uma classe tiver o método __serialize()e __sleep(), a serialize()função chama __serialize()apenas o método e ignora o __sleep()método.

Resumo

  • Use a serialize()função para serializar um objeto em uma string de representação de fluxo de bytes.
  • Use o método __sleep()ou __serialize()para implementar a lógica antes da serialização.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *