| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- 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 ligeira 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>
- <para>
- Todos os objetos descodificados assim são retornados como objetos de
- <classname>StdClass</classname> 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 <acronym>PHP</acronym>, 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 <property>enableJsonExprFinder</property> e
- defini-la para <constant>TRUE</constant> para a função
- <methodname>encode()</methodname>. 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:
- -->
|