|
|
@@ -1,35 +1,128 @@
|
|
|
-<sect1 id="zend.json.objects">
|
|
|
- <title>Objetos JSON</title>
|
|
|
- <para>
|
|
|
- Quando codificamos objetos PHP como JSON, todas as propriedades públicas
|
|
|
- desse objeto estarão codificadas em um objeto JSON.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Descodificar objetos JSON traz uma ligeria dificuldade, entretanto, desde
|
|
|
- que os objetos do Javascript correspondam o mais próximo de uma matriz
|
|
|
- associativa do PHP. Alguns sugerem que um identificador da classe deve
|
|
|
- ser passado, e um exemplo do objeto dessa classe deve ser criado e
|
|
|
- populado com os pares chave/valor do objeto JSON; outros pensam que isto
|
|
|
- poderia gerar um risco substancial da segurança.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Por padrão, <code>Zend_Json</code> irá descodificar objetos JSON como
|
|
|
- matriz associativas. Entretanto, se você deseja que o retorne um objeto,
|
|
|
- você pode especificar isto:
|
|
|
- <programlisting role="php"><![CDATA[<?php
|
|
|
-// Descodifique objetos como objetos
|
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
|
+<!-- EN-Revision: 17227 -->
|
|
|
+<!-- Reviewed: no -->
|
|
|
+<sect1 id="zend.json.advanced">
|
|
|
+ <title>Uso Avançado do Zend_Json</title>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.objects1">
|
|
|
+ <title>Objetos JSON</title>
|
|
|
+ <para>
|
|
|
+ Quando codificamos objetos <acronym>PHP</acronym> como <acronym>JSON</acronym>, todas
|
|
|
+ as propriedades públicas desse objeto estarão codificadas em um objeto
|
|
|
+ <acronym>JSON</acronym>.
|
|
|
+ </para>
|
|
|
+ <para>
|
|
|
+ <acronym>JSON</acronym> não permite referências de objeto, por isso deve-se tomar
|
|
|
+ cuidado para não codificar objetos com referências recursivas. Se você tiver problemas
|
|
|
+ com a recursividade, <methodname>Zend_Json::encode()</methodname> e
|
|
|
+ <methodname>Zend_Json_Encoder::encode()</methodname> permitem um segundo parâmetro
|
|
|
+ opcional para verificar a recursividade; se um objeto for serializado duplamente,
|
|
|
+ uma exceção será lançada.
|
|
|
+ </para>
|
|
|
+ <para>
|
|
|
+ Descodificar objetos <acronym>JSON</acronym> traz uma ligeria dificuldade, entretanto,
|
|
|
+ desde que os objetos do JavaScript correspondam o mais próximo de uma matriz
|
|
|
+ associativa do <acronym>PHP</acronym>. Alguns sugerem que um identificador da classe
|
|
|
+ deve ser passado, e um exemplo do objeto dessa classe deve ser criado e populado com
|
|
|
+ os pares chave/valor do objeto <acronym>JSON</acronym>; outros pensam que isto poderia
|
|
|
+ gerar um risco substancial da segurança.
|
|
|
+ </para>
|
|
|
+ <para>
|
|
|
+ Por padrão, <classname>Zend_Json</classname> irá descodificar objetos
|
|
|
+ <acronym>JSON</acronym> como matriz associativas. Entretanto, se você deseja que o
|
|
|
+ retorne um objeto, você pode especificar isto:
|
|
|
+ </para>
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+// Descodifique objetos JSON como objetos PHP
|
|
|
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
|
|
|
-?>]]></programlisting>
|
|
|
- Todos os objetos descodificados assim são retornados como objetos de
|
|
|
- <code>StdClass</code> com as propriedades que correspondem aos pares
|
|
|
- chave/valor na notação de JSON.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- A recomendação do Zend Framework é que o desenvolvedor deve decidir-se
|
|
|
- como descodificar objetos JSON. Se um objeto de um tipo especificado
|
|
|
- for criado, pode ser criado no código do desenvolvedor e ser populado com
|
|
|
- os valores descodificados usando <code>Zend_Json</code>.
|
|
|
- </para>
|
|
|
+]]></programlisting>
|
|
|
+ <para>
|
|
|
+ Todos os objetos descodificados assim são retornados como objetos de
|
|
|
+ <code>StdClass</code> com as propriedades que correspondem aos pares chave/valor na
|
|
|
+ notação de <acronym>JSON</acronym>.
|
|
|
+ </para>
|
|
|
+ <para>
|
|
|
+ A recomendação do Zend Framework é que o desenvolvedor deve decidir-se como
|
|
|
+ descodificar objetos <acronym>JSON</acronym>. Se um objeto de um tipo especificado for
|
|
|
+ criado, pode ser criado no código do desenvolvedor e ser populado com os valores
|
|
|
+ descodificados usando <classname>Zend_Json</classname>.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.objects2">
|
|
|
+ <title>Codificando Objetos PHP</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se você estiver codificando objetos <acronym>PHP</acronym> por padrão, o mecanismo de
|
|
|
+ codificação só poderá acessar as propriedades públicas desses objetos. Quando o método
|
|
|
+ <methodname>toJson()</methodname> é implementado em um objeto para codificar,
|
|
|
+ <classname>Zend_Json</classname> chama esse método e espera que o objeto retorne uma
|
|
|
+ representação <acronym>JSON</acronym> de seu estado interno.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.internal">
|
|
|
+ <title>Codificador/Descodificador Interno</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ <classname>Zend_Json</classname> tem dois modos diferentes, dependendo se ext/json
|
|
|
+ está habilitado em sua instalação do <acronym>PHP</acronym> ou não. Se estiver
|
|
|
+ instalado por padrão, <methodname>json_encode()</methodname> e
|
|
|
+ <methodname>json_decode()</methodname> são utilizados para a codificação e
|
|
|
+ descodificação <acronym>JSON</acronym>. Se não estiver instalado, uma implementação do
|
|
|
+ Zend Framework no código <acronym>PHP</acronym> é usada para a codificação e
|
|
|
+ descodificação. Este último é consideravelmente mais lento do que usando a extensão do php,
|
|
|
+ mas comporta-se exatamente da mesma forma.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Entretanto, você talvez queira usar o codificador/descodificador interno mesmo tendo o
|
|
|
+ ext/json instalado. Você pode conseguir isso chamando:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+Zend_Json::$useBuiltinEncoderDecoder = true:
|
|
|
+]]></programlisting>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.expr">
|
|
|
+ <title>Expressões do JSON</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Javascript faz uso pesado de funções de callback anônimas, que podem ser guardadas
|
|
|
+ dentro de variáveis de objeto <acronym>JSON</acronym>. Mesmo assim elas só
|
|
|
+ funcionam se não forem devolvidas dentro aspas duplas, que
|
|
|
+ <classname>Zend_Json</classname> naturalmente faz. Com o suporte à Expressão no
|
|
|
+ <classname>Zend_Json</classname>, você pode codificar objetos <acronym>JSON</acronym>
|
|
|
+ com callbacks de javascript válidos. Isso funciona tanto para
|
|
|
+ <methodname>json_encode()</methodname> quanto para o codificador interno.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Um callback javascript é representado usando o objeto
|
|
|
+ <classname>Zend_Json_Expr</classname>. Ela implementa o padrão value object e é
|
|
|
+ imutável. Você pode definir a expressão javascript como o primeiro argumento do
|
|
|
+ construtor. Por padrão <classname>Zend_Json::encode</classname> não codifica callbacks
|
|
|
+ de javascript, você deverá passar a opção <code>'enableJsonExprFinder' = true</code>
|
|
|
+ para a função codificadora. Se ativado, o suporte à expressão funcionará para todas as
|
|
|
+ expressões aninhadas em estruturas de grande porte.
|
|
|
+ Um exemplo de uso seria parecido com:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$data = array(
|
|
|
+ 'onClick' => new Zend_Json_Expr('function() {'
|
|
|
+ . 'alert("I am a valid javascript callback '
|
|
|
+ . 'created by Zend_Json"); }'),
|
|
|
+ 'other' => 'no expression',
|
|
|
+);
|
|
|
+$jsonObjectWithExpression = Zend_Json::encode(
|
|
|
+ $data,
|
|
|
+ false,
|
|
|
+ array('enableJsonExprFinder' => true)
|
|
|
+);
|
|
|
+]]></programlisting>
|
|
|
+ </sect2>
|
|
|
</sect1>
|
|
|
<!--
|
|
|
vim:se ts=4 sw=4 et:
|