Link original: http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html
Catálogo Geral
O quê, Por que, Como
O quê
Por que
Como funciona
a sintaxe de serialização do PHP
Exemplo de serialização PHP
Serialize para JSON em JavaScript — usando json2.js
Serialize para JSON em JavaScript — usando protótipo.js
PHP com a função JSON
json_decode
função json_encode
exemplo de função json_decode
de exemplo da função json_encode
fornece
uma explicação verdadeira do histórico de conhecimento
Parte JavaScript de front-end
Parte back-end do PHP
O que, por que, como
o que
Ok, queridos amigos, vamos começar a jornada desse novo conceito. Talvez nem todos tenham prestado muita atenção ao tópico de serialização antes. Na verdade, ele se originou no dia em que folheei casualmente o manual do PHP. e encontrei essa serialização Depois disso, fiquei entediado e fiz um plug-in para WordPress. Nesse momento, usei a serialização e descobri que ela é realmente muito conveniente em certas situações.
Vamos primeiro explicar a serialização: Simplificando, a serialização é o processo de conversão de variáveis em um fluxo de bytes. A introdução da serialização resolve efetivamente o problema de armazenamento e transmissão de objetos. Por exemplo, criei um objeto em JavaScript e agora quero salvar esse objeto no banco de dados do servidor. de objetos é freqüentemente usado. Na serialização de JavaScript, devemos mencionar JSON (JavaScript Object Notation) é um formato leve de troca de dados. Fácil de ler e escrever para humanos e fácil de analisar e gerar para máquinas. É baseado na linguagem de programação JavaScript, um subconjunto do padrão ECMA-262 3ª edição - dezembro de 1999. JSON usa um formato de texto completamente independente de linguagem, mas também usa convenções semelhantes à família de linguagens C (incluindo C, C++, C#, Java, JavaScript, Perl, Python, etc.). Essas propriedades tornam o JSON uma linguagem ideal para troca de dados.
As pessoas costumam comparar JSON e XML. Ambos são um meio de nivelar objetos (explicaremos esse "nivelamento" mais tarde). O XML é caracterizado por uma estrutura rigorosa, enquanto o JSON é caracterizado por ser simples e fácil de usar. o programa para análise, porque ele pode facilmente converter um objeto na forma de um fluxo de caracteres, como o seguinte código:
Code:
{"type":"human","name":"hanguofeng","age": 22 }
é uma expressão JSON que salva um objeto. Como podemos restaurá-lo em um objeto? É muito simples, como segue:
Código:
var animal_str = '{"type":"human","name":"hanguofeng","age":22}';
var animal2=eval('(' + animal_str + ')');
Usamos a função de avaliação JavaScript para operar a expressão JSON e retornar o valor para obter um objeto. Neste ponto, acho que você definitivamente entenderá. admire o pensamento do criador do formato JSON. Originalmente eu ia falar sobre serialização, mas "acidentalmente" mencionei JSON e falei muito sobre isso Haha, saí do assunto? Não, a serialização do PHP é muito semelhante ao JSON. Uma expressão de serialização do PHP é a seguinte:
Código:
a:3:{s:4:"tipo";s:5:"humano";s:4:"nome";s:10:"hanguofeng";s:3:"idade";s:2:" 20";}
Sua estrutura é um pouco semelhante ao JSON. Na verdade, esta expressão é o resultado serializado do seguinte array:
Código:
$animal =
variedade
(
"tipo" => "humano",
"nome" => "hanguofeng",
"idade" => "20"
);
OK, a introdução acima é apenas para lhe dar uma ideia aproximada do que são serialização e JSON. Você não precisa se envolver muito com o código aqui. Vamos explicar isso em detalhes mais tarde. usar serialização.
Por que
a serialização apareceu pela primeira vez como uma conveniência para transmissão de dados Como fiz a pergunta no início deste artigo, criei um objeto em JavaScript. Agora quero salvar esse objeto no banco de dados do servidor. Na verdade, é uma questão de "como faço para enviar um objeto do navegador para o servidor". Durante este processo de transmissão, sabemos que apenas o fluxo de caracteres pode realmente ser transmitido. O fluxo de caracteres é unidimensional (plano). , mas muitos objetos Mas é multidimensional Se o objeto a ser transferido for uma string, podemos usá-lo diretamente como o conteúdo transferido. preciso usar caracteres Para descrevê-lo, por exemplo, ao telefone, se eu perguntar qual é o seu nome, você me dirá que seu nome é Zhang San ou Li Si, e se eu perguntar, como você é. , você precisa usar palavras. Foi-me descrito que o meio pelo qual transmitimos dados é muitas vezes o mesmo que esta linha telefônica, que só pode transmitir fluxos de caracteres, e o processo pelo qual descrevemos objetos é na verdade um processo de serialização. .
Além disso, a serialização também pode ser usada para armazenamento persistente de objetos. Talvez você, como eu, já tenha pensado em armazenar um objeto em um determinado campo do banco de dados. Agora podemos fazer isso de maneira muito simples e, seu campo de banco de dados não precisa. para ser definido com um formato especial, basta configurá-lo como varchar (é claro, se o objeto for grande, pode ser necessário configurá-lo como texto).
Como funciona
a sintaxe de serialização do PHP
Ok, acho que você entendeu as questões de O quê e Por quê. No final desta seção, falaremos sobre algo mais teórico, ou seja, como usar PHP para serializar e desserializar dados, como serializar JavaScript. objetos (ou seja, alterá-los para o formato JSON) e como desserializá-los. Finalmente, como estabelecer um relacionamento entre a serialização JSON e PHP.
O PHP nos fornece duas funções para operações de serialização e desserialização. Essas duas funções são: serialize(
) e unserialize(). Elas são adequadas para PHP4 e PHP5
. :0.1.0-0.1.1)
string
de valor de representação armazenável
serialize (mixed $value)
Obtenha um valor de representação armazenável Esta função é usada para armazenar ou transferir valores e estruturas de variáveis PHP sem perdas.
Se precisar converter o valor serializado de volta em uma variável PHP, você pode usar a função unserialize().
Valor
do parâmetro
Ou seja, a expressão sendo serializada. serialize() lida com todos os tipos, exceto ponteiros de recursos, e você pode até serializar um array contendo elementos apontando para si mesmo. As matrizes ou objetos serializados que contêm ponteiros de loop ainda serão armazenados, mas outros ponteiros serão perdidos.
Ao serializar um objeto, o PHP tenta primeiro chamar sua função membro __sleep(). Isso permitirá coisas como a limpeza final antes que o objeto seja serializado. Da mesma forma, quando o objeto for restaurado usando a função unserialize(), a função membro __wakeup() será chamada.
O valor de retorno
retorna uma string contendo uma expressão de fluxo de bytes do objeto que pode ser armazenada em qualquer lugar.
unserialize()
(PHP 4, PHP 5, eixo PECL2:0.1.0-0.1.1)
Obtenha
um valor de variável PHP a partir de uma expressão armazenada
mixed unserialize (string $str)
unserialize() pega um tipo simples de variável serializada e a converte de volta em um valor de variável PHP.
Parâmetro
str
string serializada Se a variável desserializada for um objeto, após restaurar com sucesso a estrutura do objeto, o PHP tentará automaticamente executar a função membro __wakeup() do objeto (se existir).
Diretiva unserialize_callback_func: Você pode definir a função de retorno de chamada a ser executada durante este processo, se uma classe indefinida for instanciada durante a desserialização (para evitar obter um objeto incompleto "__PHP_Incomplete_Class"). Você pode usar php.ini, ini_set() ou .htaccess para definir "unserialize_callback_func". É chamado quando uma classe indefinida é instanciada. Para desabilitar esse recurso basta configurá-lo como vazio.
O valor de retorno
retorna o valor convertido, que pode ser uma variável booleana, número real, número de ponto flutuante, string, array ou objeto.
Se a string recebida não puder ser desserializada, FALSE será retornado e um erro NOTICE será gerado.
(O texto acima foi traduzido do manual do PHP)
Serialização e desserialização da
matriz deinstância de serialização do PHP
OK, vamos aprender com um exemplo. Primeiro, crie o arquivo sample1.php. matriz:
Código:
<?php
$animal =
variedade
(
"tipo" => "humano",
"nome" => "hanguofeng",
"idade" => "20"
);
?>
Para testar o valor deste array, você pode usar a função print_r() para gerar o array. Os resultados de saída são os seguintes:
Código:
Variedade
(
[tipo] => humano
[nome] => hanguofeng
[idade] => 20
)
Então vamos serializá-lo. O código de serialização é o seguinte:
Código:
<?php
$animal =
variedade
(
"tipo" => "humano",
"nome" => "hanguofeng",
"idade" => "20"
);
$animal_ser=serialize($animal);
eco($animal_ser);
?>
Aqui serializamos o array $animal, salvamos a string serializada retornada na variável $animal_ser e a geramos. O resultado da saída é:
Código:
a:3:{s:4:"tipo";s:5:"humano";s:4:"nome";s:10:"hanguofeng";s:3:"idade";s:2:" 20";}
Vamos simplesmente analisar esta string:
a:3 indica que este é um objeto array (a), que possui três objetos integrados (3)
A parte entre colchetes é uma lista separada por vírgulas de expressões de objetos. Tomando s:4:"type" como exemplo, ela representa uma(s) string(s) com comprimento de 4 dígitos (4) e um valor de "type" (tipo). , essa é a chave do primeiro elemento da matriz hash.
Não entraremos em detalhes nas partes seguintes. Você pode tentar serializar vários objetos e ver como a string serializada é construída.
Vejamos a desserialização do array, ou seja, a restauração da string serializada que geramos acima em um array. O código é o seguinte:
Código:
<?php
$animal_ser='a:3:{s:4:"tipo";s:5:"humano";s:4:"nome";s:10:"hanguofeng";s:3:"idade";s :2:"20";}';
$animal = unserialize($animal_ser);
print_r($animal);
?>
Na primeira linha, assumimos que o valor de $animal_ser é a string serializada obtida acima. Na segunda linha, a string é restaurada para o array inicial e atribuída a $animal. Finalmente, o array $animal é gerado. time A saída é igual à saída original do array no início desta seção, ou seja:
código:
Variedade
(
[tipo] => humano
[nome] => hanguofeng
[idade] => 20
)
Desta forma, concluímos a desserialização do array.
Expandir conhecimento - Serialização e desserialização de objetos personalizados
Serializar arrays é uma operação básica. No entanto, na programação real, muitas vezes podemos serializar outros tipos de variáveis, como Objetos personalizados são serializados. Aqui está uma classe A escrita por nós mesmos (salva em classe. .inc):
Código:
<?php
classe A {
var $um = 1;
função mostrar_um() {
echo $este->um;
}
}
?>
Criamos uma instância da classe e serializamos a instância no seguinte código:
Código:
<?php
include("classa.inc");
$a=novo A;
eco(serialize($a));
?>
O conteúdo de saída neste momento é:
código:
O:1:"A":1:{s:3:"um";i:1;}
No geral, essa string serializada gera o estado atual do objeto, ou seja, o valor de i é 1. Vamos analisar os detalhes um por um. O:1: Como a variável atual é um objeto customizado, o caractere caracterizante é "O", que significa Objeto. O "A" a seguir identifica de qual classe a variável é uma instância, aqui é a classe A. Dentro das chaves estão os nomes e valores de cada atributo da instância. Então desserializamos:
Código:
<?php
include("classa.inc");
$s = 'O:1:"A":1:{s:3:"um";i:1;}';
$a = desserializar($s);
$a->show_one();
?>
Neste momento, "1" é gerado, ou seja, o método show_one() da classe A é chamado. Você pode notar que, embora a string serializada da instância não contenha o método de classe, ainda podemos chamar o método de classe depois de desserializá-lo. Este recurso é suportado no PHP4 e superior (é claro, você precisa incluir o arquivo de definição de classe). classe.inc).
Nota: Você pode consultar a seção Referência de Linguagem->Classes e Objetos->Serializando objetos - objetos em sessões do manual do PHP.
Serializando para JSON em JavaScript — usando json2.js
Não existe um método integrado para serializar objetos diretamente em JavaScript É claro que você mesmo pode escrever um, mas ainda assim recomendo que você seja preguiçoso aqui e use componentes JSON prontos. O site oficial www.json.org fornece uma biblioteca de códigos para serialização JSON de objetos JavaScript - json2.js, que você pode obter aqui.
Depois de obter o arquivo json2.js, você pode abrir este arquivo. A primeira parte do arquivo contém uma quantidade considerável de informações de comentários. Se o seu inglês for bom o suficiente, você pode omitir esta seção e apenas consultar os comentários do arquivo. Ok, se como programador você já viu letras suficientes e deseja ver meus caracteres chineses + letras, então você pode continuar abaixo.
Simplesmente traduza este comentário: Consulte http://www.JSON.org/js.html Este arquivo cria um objeto global JSON contendo dois métodos:
Código:
JSON.stringify(valor, lista de permissões)
valor qualquer valor JavaScript, geralmente um objeto ou array
whitelist Um parâmetro de matriz opcional usado para determinar como o valor do objeto é serializado. Este método gera texto JSON a partir de um valor JavaScript. Ao serializar, existem três possibilidades baseadas na lista de permissões de parâmetros opcionais:
Se um objeto tiver um método toJSON, chame esse método e o valor de retorno do método toJSON será serializado.
Caso contrário, se o parâmetro opcional da lista de permissões for um array, os elementos do array serão usados para selecionar os membros do objeto para serialização.
Caso contrário, se o parâmetro whitelist não for utilizado, todos os membros do objeto serão serializados.
Se um valor não tiver representação JSON, como indefinido ou uma função, ele não será serializado. Nos objetos, tais valores serão ignorados e nos arrays serão substituídos por nulos.
JSON.stringify(indefinido) retornará indefinido. A data será serializada para a data ISO citada.
Exemplo:
código:
var text = JSON.stringify(['e', {pluribus: 'unum'}]);
//texto é '["e",{"pluribus":"unum"}]'
JSON.parse(texto, filtro)
Este método analisa um texto JSON e gera um componente ou array, que pode gerar uma exceção SyntaxError.
O parâmetro opcional filter é uma função que filtra e transforma os resultados. Ele aceita cada chave e valor, e seu valor de retorno é usado para substituir o valor de origem. Se retornar o valor recebido, o resultado permanece inalterado. Se retornar indefinido, o membro será excluído.
Exemplo:
código:
//Analisar o texto e se uma chave contiver a string "data", converter seu valor em uma data
meusDados = JSON.parse(texto, função (chave, valor) {
return key.indexOf('data') >= 0 ? nova data(valor): valor;
});
O tutorial introdutório acima deu a você uma compreensão básica de como usar json2.js. Não entrarei em detalhes sobre este arquivo aqui, apenas tenho uma pequena dica. Se você quiser simplesmente analisar um texto JSON, você pode usar eval. () Função, a função é uma função integrada do JavaScript. Por exemplo, para analisar o texto JSON gerado no caso de JSON.stringify, você pode usar:
código:
var meuE = eval('["e",{"pluribus":"unum"}]');
para obter o objeto myE.
Serializar para JSON em JavaScript – use protótipo.js
Se você é como eu e gosta de usar estruturas JavaScript de código aberto em seus projetos, então você pode pular o uso do arquivo json2.js Aqui, protótipo.js é Por exemplo, este. O arquivo pode ser baixado em http://www.prototypejs.org Como este artigo não é sobre a estrutura JavaScript, presumo aqui que você já tenha algum conhecimento do uso de protótipo.js.
protótipo.js fornece o método toJSON para objetos Object. Você pode usar o método Object.toJSON() para obter a serialização de objetos, por exemplo:
código:
var gato=
{
nome:"hellokitty",
altura:"6 maçãs"
}
alerta(Object.toJSON(cat));
//Uma caixa de diálogo aparecerá com o conteúdo {"name": "hellokitty", "height": "6 apples"}
Além disso, há suporte JSON adicional em protótipo.js, principalmente a análise do conteúdo JSON na solicitação de retorno Ajax no objeto Ajax. Por enquanto, isso não tem nada a ver com nosso conteúdo e não será apresentado novamente.
PHP e JSON
Acima aprendemos sobre o método de serialização de objetos em PHP e o método de serialização de objetos em JSON em JavaScript. Você provavelmente questionará por que coloquei os dois juntos, porque na verdade a sintaxe deles não é exatamente a mesma. em PHP é possível desserializar texto JSON, e também é possível serializar objetos PHP para JSON em vez de texto estilo PHP. Isso é realizado principalmente pelas duas funções json_decode e json_encode. Deve-se observar que essas duas funções são suportadas apenas no PHP 5 >= 5.2.0. não pode ser usado.
sintaxe
da função json_decode
misturada json_decode (string $json [, bool $assoc] )
Obtenha um texto codificado em JSON e converta-o em
parâmetro
de variável PHPjson
Texto codificado JSON
associado
Quando TRUE, o valor de retorno é uma matriz associativa
O valor de retorno
é
um objeto,
ou se o parâmetro assocopcional
for TRUE, uma matriz associativa será retornada.
valor
de parâmetro
de expressão JSON
de um valor
O valor a ser codificado pode ser qualquer tipo de parâmetro, exceto recurso. Esta função funciona apenas no formato de codificação UTF-8.
Retorna
o
texto JSON codificado em caso de sucesso
. suposição, ou seja, temos um módulo de registro de usuário, que funciona de maneira "orientada a objetos". Na instância da função json_decode, transformamos as informações de registro do usuário em um atributo de classe em primeiro plano e, em seguida, passamos para o segundo plano. php (para simplificar, Ajax não é usado aqui). No exemplo json_encode, referenciamos um arquivo js no arquivo html, o endereço aponta para o arquivo php e geramos o objeto de usuário codificado em json no arquivo php (também para simplificar, geramos diretamente um objeto sem obter as informações de o banco de dados) e saída em HTML.
Ok, vamos primeiro dar uma olhada na página front-end json_encode.htm. Esta página imita a página de registro normal. Quando enviada, a função JavaScript é acionada, um objeto de usuário user é gerado e o conteúdo do formulário. é definido como o objeto do usuário, gere o texto JSON e passe-o para o arquivo json_encode.php de fundo no modo POST. No arquivo js_encode.php, use a função json_decode para analisar o texto JSON em um objeto PHP e produzi-lo.
Ok, vamos primeiro dar uma olhada no arquivo json_encode.html. O código do arquivo é o seguinte:
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<cabeça>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_decode</title>
<script src="json2.js" type="text/javascript"></script>
<script type="texto/javascript">
função JSON_test(o){
var usuário = {
nome:document.getElementById('txt_name').valor,
email:document.getElementById('txt_email').valor,
senha:document.getElementById('txt_name').valor
}
var json_string = JSON.stringify(usuário);
document.getElementById('txt_json').value=json_string;
alert("Clique em OK para enviar o formulário");
o.enviar();
}
</script>
</head>
<corpo>
<form id="form1" name="form1" method="post" action="json_encode.php" onsubmit="JSON_test(this)">
<label for="txt_name">Nome</label>
<p>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">E-mail</label>
<p>
<input type="text" name="txt_email" id="txt_email" />
</p>
<p>
<label for="txt_password">Senha</label>
</p>
<p>
<input type="text" name="txt_password" id="txt_password" />
</p>
<p>
<input type="text" name="txt_json" id="txt_json" />
<label for="botão"></label>
<input type="submit" name="button" id="button" value="JSON" />
</p>
</form>
</body>
</html>
Quando o formulário for enviado, a função JavaScript JSON_text() será acionada. Esta função primeiro cria um objeto JavaScript usuário, define seus atributos de nome, email e senha para os valores do formulário correspondente e, em seguida, usa o JSON.stringify. método do arquivo json2.js para Ele é convertido em texto JSON json_string e, finalmente, o campo oculto é definido (para deixar claro aqui, exibo esse campo oculto na forma de uma caixa de texto) o valor de txt_json é json_string, e o formulário é enviado.
Em seguida acesse o arquivo json_encode.php, conforme segue:
Código:
<?php
$json_string = $_POST["txt_json"];
if(ini_get("magic_quotes_gpc")=="1")
{
$json_string=stripslashes($json_string);
}
$usuário = json_decode($json_string);
echo var_dump($usuário);
?>
Neste arquivo, primeiro obtenha o valor do campo do formulário POST txt_json no arquivo json_encode.html, coloque-o na variável $json_string e, em seguida, julgue se a configuração atual do PHP é magic_quotes_gpc=On, ou seja, as aspas duplas recebidas será convertido em significado, de modo que a função json_decode não possa analisá-lo, então precisamos remover o escape dele.
o
na variável $user e, finalmente, use echo var_dump($user);
objeto(stdClass)#1 (3) {
["nome"]=>
string(10) "hanguofeng"
["e-mail"]=>
string(18) " exemplo@domínio.com "
["senha"]=>
string(10) "hanguofeng"
}
a instância da função json_encode
ainda é composta de duas partes, nomeadamente json_enode.html e json_encode.php. No arquivo json_decode.html, o formato é basicamente semelhante ao arquivo json_decode.html, mas a diferença é que desta vez queremos obter o texto JSON do usuário correspondente do arquivo json_encode.php. primeiro:
Código:
<?php
Usuário de classe{
público $nome="";
público $e-mail="";
pública $senha="";
};
$meuUsuário = novo usuário;
$meuUsuário->nome="hanguofeng";
$meuUsuário->email=" exemplo@domínio.com ";
$meuUsuário->senha="hanguofeng";
$json_string = json_encode($meuUsuário);
?>
var usuário = <?php echo($json_string)?>;
Este arquivo primeiro cria a classe user, depois obtém uma instância da classe de usuário myUser e define seu nome de usuário, email e senha. Em seguida, ele usa a função json_encode para convertê-lo em texto JSON, salva-o na variável $ json_string e, finalmente,. gera um pedaço de código JavaScript para criar a variável global user em JavaScript.
A seguir, precisamos introduzir o arquivo json_encode.php no arquivo json_encode.html e obter os diversos atributos do objeto de usuário, como segue:
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<cabeça>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_encode</title>
<script src="json_encode.php" type="text/javascript"></script>
</head>
<corpo>
<form id="form1" name="form1" método="post">
<label for="txt_name">Nome</label>
<p>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">E-mail</label>
<p>
<input type="text" name="txt_email" id="txt_email" />
</p>
<p>
<label for="txt_password">Senha</label>
</p>
<p>
<input type="text" name="txt_password" id="txt_password" />
</p>
</form>
<script type="texto/javascript" >
document.getElementById('txt_name').value=user.name;
document.getElementById('txt_email').value=user.email;
document.getElementById('txt_password').value=user.senha;
</script>
</body>
</html>
Neste arquivo, você precisa prestar atenção em dois pontos. O primeiro é que introduzimos o arquivo json_encode.php como um arquivo JavaScript com este código:
Código:
<script src="json_encode.php" type="text/javascript"></script>
O segundo ponto é:
Adicionamos código JavaScript após o código da caixa de texto, operamos o atributo de valor da caixa de texto e definimos seu valor para o valor correspondente do objeto de usuário.