aprender PHP logo

Se você trabalha em qualquer área do desenvolvimento há muito tempo, provavelmente já deve ter se deparado com tipos de dados estranhos, como a {php}string{/php} apresentada abaixo:

a:3:{s:6:"chave1";b:1;i:0;i:1234;i:1;a:2:{i:0;i:1;i:1;i:2;}}

Isso se chama serialização, ou seja, transformar qualquer tipo de dado em uma string para ter a possibilidade de salvar tais dados na base de dados.

Neste artigo, você vai entender como criar dados serializados e fazer a desserialização (retornar o tipo de dados original) posteriormente.

Serialização de dados PHP

Para serializar qualquer tipo de dado em PHP, simplesmente utilize a função {php}serialize{/php} (ver manual). Por exemplo:

<?php
// Array original
$array_original = array(
	'chave1' => true,
	1234,
	array(1,2),
);

// Serializando o array
// a:3:{s:6:"chave1";b:1;i:0;i:1234;i:1;a:2:{i:0;i:1;i:1;i:2;}} 
$array_serializado = serialize($array_original);
?>

O {php}array{/php} serializado acima deverá retornar o seguinte:

a:3:{s:6:"chave1";b:1;i:0;i:1234;i:1;a:2:{i:0;i:1;i:1;i:2;}}

Embora isso não se pareça inteligível para mais leigos, ao final do artigo vou explicar como ler e entender tais dados.

Se você salvar a {php}string{/php} gerada pela serialização no seu banco de dados, vai conseguir recuperar seus dados originais com apenas uma linha de código. É isso que vamos ver agora.

Desserialização em PHP

Certo, então eu tenho aquele dado estranho na minha base de dados, como faço para recuperar o formato original?

Simples demais, veja:

<?php
// Array serializado
$array_serializado = 'a:3:{s:6:"chave1";b:1;i:0;i:1234;i:1;a:2:{i:0;i:1;i:1;i:2;}}';

// Retornando o array original
$array_original = unserialize( $array_serializado );

print_r( $array_original );

/**

Retorno: 
Array
(
    [chave1] => 1
    [0] => 1234
    [1] => Array
        (
            [0] => 1
            [1] => 2
        )

)
*/
?>

Na verdade é só utilizar a função {php}unserialize{/php} (ver manual).

Nos meus exemplos acima, utilizei apenas arrays como cobaias, porém, isso funciona com quase todos os tipos de dados, como objetos, arrays, booleans, e assim por diante.

Como funciona a serialização em PHP

A serialização sabe exatamente qual o tipo de dado você está serializando pelo simples fato de deixar tudo anotado na própria string.

Veja nosso exemplo anterior:

a:3:{s:6:"chave1";b:1;i:0;i:1234;i:1;a:2:{i:0;i:1;i:1;i:2;}}

Vamos organizar e indentar esses valores para você entender melhor.

a:3: {
	s:6: "chave1";
	b:1; 
	i:0;
	i:1234;
	i:1;
	a:2: {
		i:0;i:1;i:1;i:2;
	}
}

Sempre temos uma letra e um número que indicam o tipo de dado e seu tamanho, em seguida seu valor. Por exemplo:

  • a:3: Array com 3 chaves/valores
  • s:6; String com 6 casas
  • b:1; Boolean verdadeiro (0 para falso)
  • i:0; Inteiro 0
  • i:1234; Inteiro 1234
  • a:2: Array com 2 chaves/valores

E temos mais alguns tipos, exemplo:

  • N; Null
  • O:N:"stdClass":N: Objeto

Não que você vá precisar ler dados serializados, já que o PHP faz isso graciosamente por você com a função {php}unserialize{/php}, porém, é sempre importante entender como as coisas funcionam.