Neste artigo venho falar sobre um conjunto de funções úteis, sobretudo para a exportação de dados, do mais diversos tipos, para um simples formato textual, tipo string.

Imagine que pretende:

  • Guardar um Array na base de dados,
  • Enviar uma estrutura de dados pela rede;
  • Guardar objectos na base de dados;
  • Transmitir dados a um outro servidor web ou um Web Service;
  • etc.

Como o fazer de forma simples e escalável, de modo a suportar praticamente todo o tipo de dados?

No PHP existe diversos modos de realizar esta tarefa, muitos deles que provavelmente serão árduos realizar e implementar de raiz no seu sistema.


Irei falar então de 3 métodos de exportação de dados:

  1. var_export() / eval()
  2. serialize() / unserialize()
  3. json_encode() / json_decode()

Todas as funções em cima permitem a exportação  do conteúdo de uma variável, transformando esse mesmo conteúdo numa representação textual que pode ser guardada como uma simples string. Mas no entanto nem todas estas funções operam de mesmo modo.


var_export() e eval()

O var_export permite obter informação estruturada sobre uma variável especifica.  Esta função é semelhante à função var_dump(), mas a diferença está no facto de a representação retornada pela função ser código PHP válido, que pode ser armazenado numa outra variável como string. Como recuperar, perguntam vocês? Para recuperar o conteúdo original e o manipular livremente, basta recorrer à função eval() para interpretar a string obtida anteriormente (lembrem-se que a string era código PHP válido!).

É de notar que esta função não consegue exportar correctamente referencias circulares (Arrays, variáveis e objectos organizados em estruturas lógicas circulares). Variáveis do tipo resource também não podem ser exportadas por esta função.

Exemplo básico:

< ?php
$array1 = array('segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sabado', 'domingo');
//exportar
$result = var_export($array1, true);
echo $result;
/* output realizado:
array (   0 => 'segunda',   1 => 'terça',   2 => 'quarta',   3 => 'quinta',
  4 => 'sexta',   5 => 'sabado',   6 => 'domingo', )
*/
//recuperar utilizando eval()
$newArray = '';
eval('$newArray = '.$result . ';');
//a variavel $newArray agora possui o array original.
?>

Nota importante: Cuidado ao utilizar a função eval, pois esta é capaz de executar qualquer tipo de código PHP, podendo se transformar facilmente num buraco na segurança da sua aplicação ou script, se não verificar o conteúdo da string passada como parâmetro da função e sem possuir absoluta certeza desta provir de locais totalmente confiáveis (exemplo de origens não confiáveis:  as variáveis $_GET, $_POST, $_COOKIE e $_SERVER).


serialize() / unserialize()

O serialize, semelhante ao var_export, consegue gerar uma representação textual de qualquer variável, seja esta um tipo básico, um array, um objecto ou uma estrutura de dados, inclusive referencias circulares, excepto variáveis do tipo resource e PHP built-in objects.

Um exemplo básico utilizando o array $array1 definido no exemplo anterior:

< ?php
//serializar
$result = serialize($array1);
echo $result;
/* output:
a:7:{i:0;s:7:"segunda";i:1;s:5:"terça";i:2;s:6:"quarta";i:3;s:6:"quinta";i:4;s:5:"sexta"
;i:5;s:6:"sabado";i:6;s:7:"domingo";}
*/
//reverter o processo
$arr = unserialize($result);
?>


json_encode() / json_decode()

Muito semelhante ao serialize (também não consegue exportar variáveis do tipo resource), mas com diferenças menores no modo de conversão dos valores. A função devolve a representação textual do conteúdo de uma variável em formato JSON (JavaScript Object Notation), um formato de intercâmbio popular e independente da linguagem de programação no qual o sistema foi construído, utilizado para a transmissão de dados entre diversas aplicações, serviços e sistemas.

É de notar que existem situações menores que diferenciam esta função do serialize, uma delas no facto de arrays com chaves  ( array(‘chave’=>’valor’) ) serem exportados como objectos (e não como arrays), mas facilmente corrigido com um cast para array, ou mesmo com valores incorrectos.

Exemplo básico, utilizando o array $array1 do primeiro exemplo:

< ?php
$result = json_encode($array1);
echo $result;
/* output:
["segunda","terça","quarta","quinta","sexta","sabado","domingo"]
*/
//recuperar
$arr = (array)json_decode($result);
?>


Nota importante sobre json_decode e json_decode de objectos: Ao recuperar um objecto, este é considerado como objecto de StdClass (classe base do php).

Para terminar, uma dica para quem deseja serializar dados para uma base de dados (ou para outro local): transformem a string, recorrendo a função base64_encode, antes de a concatenar ao comando SQL. De certeza que irá evitar muitas dores de cabeça. Claro que para reverter, bastará utilizar a função base64_decode;

Deixo um ficheiro com exemplos simples de utilização destas funções e respectivo conteúdo:

Download: exemplo

Nenhum conteúdo relacionado.