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 = []): mixed
Linguagem 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á false
com um E_NOTICE
.
Observe que a unserialize()
função também retorna false
se a string não serializada for serializada a partir do false
valor.
Exemplo de função PHP unserialize()
Primeiro, defina uma Customer
classe que tenha três propriedades id
,, name
e 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 Customer
objeto em uma string e salvá-lo no customer.dat
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 )
Terceiro, use a unserialize()
função para converter a string serializada em um Customer
objeto.
<?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_Class
classe.
Por exemplo, se você remover a require
construçã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_Class
classe. 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); // false
Linguagem 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 FileReader
classe:
<?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 FileReader
classe, o __unserialize()
método reabre o arquivo assim que o FileReader
objeto é desserializado.
Segundo, serialize um FileReader
objeto, salve-o no objects.dat
arquivo 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()
.