PHP desserializar

Resumo : neste tutorial, você aprenderá como usar a unserialize()função PHP para converter uma string serializada em um objeto.

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

A unserialize()função converte uma string serializada em um objeto . Aqui está a sintaxe da unserialized()função:

unserialize(string $data, array $options = []): mixedLinguagem de código:  PHP  ( php )

A unserialized()função aceita dois parâmetros:

  • $dataé a string serializada.
  • $optionsé uma matriz associativa que contém as opções para converter a string serializada no objeto.

Se a unserialize()função não puder converter a string serializada ($data) em um objeto, ela retornará falsecom um E_NOTICE.

Observe que a unserialize()função também retorna falsese a string não serializada for serializada a partir do falsevalor.

Exemplo de função PHP unserialize()

Primeiro, defina uma Customerclasse que tenha três propriedades id,, namee email:

<?php

class Customer
{

    public function __construct(
        private int $id,
        private string $name,
        private string $email
    ) {
    }

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

Segundo, use a serialize()função para serializar um Customerobjeto em uma string e salvá-lo no customer.datarquivo:

<?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 )

Terceiro, use a unserialize()função para converter a string serializada em um Customerobjeto.

<?php

require 'Customer.php';

$str = file_get_contents('customer.dat');
$customer = unserialize($str);

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

Saída:

object(Customer)#1 (3) {
    ["id":"Customer":private]=> int(10)
    ["name":"Customer":private]=> string(8) "John Doe"
    ["email":"Customer":private]=> string(20) "[email protected]"
}Linguagem de código:  PHP  ( php )

Ao desserializar um objeto, se a classe do objeto não for conhecida, a unserialize()função criará um objeto da __PHP_Incomplete_Classclasse.

Por exemplo, se você remover a requireconstrução no exemplo acima da seguinte forma:

<?php

$str = file_get_contents('customer.txt');
$customer = unserialize($str);

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

Você obterá um objeto da PHP_Incomplete_Classclasse. A saída ficará assim:

object(**PHP_Incomplete_Class)#1 (4) {
    ["**PHP_Incomplete_Class_Name"]=> string(8) "Customer"
    ["id":"Customer":private]=> int(10)
    ["name":"Customer":private]=> string(8) "John Doe"
    ["email":"Customer":private]=> string(20) "[email protected]"
}Linguagem de código:  PHP  ( php )

A unserialize()função cria um objeto completamente novo que não faz referência ao objeto original. Por exemplo:

<?php

require 'Customer.php';

// serialize the customer object
$customer1 = new Customer(10, 'John Doe', '[email protected]');
$str = serialize($customer1);
file_put_contents('customer.txt', $str);

// unserialize it
$str = file_get_contents('customer.txt');
$customer2 = unserialize($str);

// these object are not the same
var_dump($customer1 === $customer2); // falseLinguagem de código:  PHP  ( php )

O método mágico __unserialize()

A unserialize()função verifica se o objeto possui o __unserialize()método. Nesse caso, ele chamará o __unserialize()método para restaurar o estado do objeto. Considere o seguinte exemplo.

Primeiro, defina uma FileReaderclasse:

<?php

class FileReader
{


    private $filehandle;

    private $filename;


    public function __construct(string $filename)
    {
        $this->filename = $filename;
        $this->open();
    }

    private function open()

    {
        $this->filehandle = fopen($this->filename, 'r');

        return $this;
    }

    public function read()
    {
        $contents = fread($this->filehandle, filesize($this->filename));

        return nl2br($contents);
    }

    public function close()
    {
        if ($this->filehandle) {
            fclose($this->filehandle);
        }
    }


    public function __sleep(): array
    {
        $this->close();

        return array('filename');
    }

    public function __unserialize(): void
    {
        $this->open();
    }
}Linguagem de código:  PHP  ( php )

Na FileReaderclasse, o __unserialize()método reabre o arquivo assim que o FileReaderobjeto é desserializado.

Segundo, serialize um FileReaderobjeto, salve-o no objects.datarquivo e desserialize-o:

<?php


require 'FileReader.php';

$filename = 'objects.dat';


// serialize the $fileReader
file_put_contents(
    $filename,
    serialize(new FileReader('readme.txt'))
);

// unserialized the file reader
$file_reader = unserialize(file_get_contents($filename));

echo $file_reader->read();

$file_reader->close();Linguagem de código:  PHP  ( php )

O método mágico __wakeup()

Semelhante ao __unserialize()método, a unserialize()função também verifica a existência do __wakeup()método do objeto não serializado.

Se presente, the unserialize()a função chamará o __wakeup()método para reconstruir o estado que o objeto pode ter.

Na prática, você pode realizar tarefas de reinicialização no __wakeup()método, como reabrir o arquivo ou reconectar-se ao banco de dados.

Se um objeto tiver métodos __unserialize()e __wakup(), ele unserialize()chamará __unserialize()apenas o método e ignorará o __wakup()método.

Resumo

  • Use o unserialize()método para converter uma string serializada em um objeto.
  • O unserialize()método chama o método __unserialize()ou __wakeup()do objeto para executar tarefas de reinicialização.
  • O unserialize()método chama o __unserialize()método somente se um objeto tiver métodos __unserialize()e __wakeup().

Deixe um comentário

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