Zend_Json-Objects.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.advanced">
  5. <title>Uso Avançado do Zend_Json</title>
  6. <sect2 id="zend.json.advanced.objects1">
  7. <title>Objetos JSON</title>
  8. <para>
  9. Quando codificamos objetos <acronym>PHP</acronym> como <acronym>JSON</acronym>, todas
  10. as propriedades públicas desse objeto estarão codificadas em um objeto
  11. <acronym>JSON</acronym>.
  12. </para>
  13. <para>
  14. <acronym>JSON</acronym> não permite referências de objeto, por isso deve-se tomar
  15. cuidado para não codificar objetos com referências recursivas. Se você tiver problemas
  16. com a recursividade, <methodname>Zend_Json::encode()</methodname> e
  17. <methodname>Zend_Json_Encoder::encode()</methodname> permitem um segundo parâmetro
  18. opcional para verificar a recursividade; se um objeto for serializado duplamente,
  19. uma exceção será lançada.
  20. </para>
  21. <para>
  22. Descodificar objetos <acronym>JSON</acronym> traz uma ligeira dificuldade, entretanto,
  23. desde que os objetos do JavaScript correspondam o mais próximo de uma matriz
  24. associativa do <acronym>PHP</acronym>. Alguns sugerem que um identificador da classe
  25. deve ser passado, e um exemplo do objeto dessa classe deve ser criado e populado com
  26. os pares chave/valor do objeto <acronym>JSON</acronym>; outros pensam que isto poderia
  27. gerar um risco substancial da segurança.
  28. </para>
  29. <para>
  30. Por padrão, <classname>Zend_Json</classname> irá descodificar objetos
  31. <acronym>JSON</acronym> como matriz associativas. Entretanto, se você deseja que o
  32. retorne um objeto, você pode especificar isto:
  33. </para>
  34. <programlisting language="php"><![CDATA[
  35. // Descodifique objetos JSON como objetos PHP
  36. $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
  37. ]]></programlisting>
  38. <para>
  39. Todos os objetos descodificados assim são retornados como objetos de
  40. <classname>StdClass</classname> com as propriedades que correspondem aos pares
  41. chave/valor na notação de <acronym>JSON</acronym>.
  42. </para>
  43. <para>
  44. A recomendação do Zend Framework é que o desenvolvedor deve decidir-se como
  45. descodificar objetos <acronym>JSON</acronym>. Se um objeto de um tipo especificado for
  46. criado, pode ser criado no código do desenvolvedor e ser populado com os valores
  47. descodificados usando <classname>Zend_Json</classname>.
  48. </para>
  49. </sect2>
  50. <sect2 id="zend.json.advanced.objects2">
  51. <title>Codificando Objetos PHP</title>
  52. <para>
  53. Se você estiver codificando objetos <acronym>PHP</acronym> por padrão, o mecanismo de
  54. codificação só poderá acessar as propriedades públicas desses objetos. Quando o método
  55. <methodname>toJson()</methodname> é implementado em um objeto para codificar,
  56. <classname>Zend_Json</classname> chama esse método e espera que o objeto retorne uma
  57. representação <acronym>JSON</acronym> de seu estado interno.
  58. </para>
  59. </sect2>
  60. <sect2 id="zend.json.advanced.internal">
  61. <title>Codificador/Descodificador Interno</title>
  62. <para>
  63. <classname>Zend_Json</classname> tem dois modos diferentes, dependendo se ext/json
  64. está habilitado em sua instalação do <acronym>PHP</acronym> ou não. Se estiver
  65. instalado por padrão, <methodname>json_encode()</methodname> e
  66. <methodname>json_decode()</methodname> são utilizados para a codificação e
  67. descodificação <acronym>JSON</acronym>. Se não estiver instalado, uma implementação do
  68. Zend Framework no código <acronym>PHP</acronym> é usada para a codificação e
  69. descodificação. Este último é consideravelmente mais lento do que usando a extensão
  70. do <acronym>PHP</acronym>, mas comporta-se exatamente da mesma forma.
  71. </para>
  72. <para>
  73. Entretanto, você talvez queira usar o codificador/descodificador interno mesmo tendo o
  74. ext/json instalado. Você pode conseguir isso chamando:
  75. </para>
  76. <programlisting language="php"><![CDATA[
  77. Zend_Json::$useBuiltinEncoderDecoder = true:
  78. ]]></programlisting>
  79. </sect2>
  80. <sect2 id="zend.json.advanced.expr">
  81. <title>Expressões do JSON</title>
  82. <para>
  83. Javascript faz uso pesado de funções de callback anônimas, que podem ser guardadas
  84. dentro de variáveis de objeto <acronym>JSON</acronym>. Mesmo assim elas só
  85. funcionam se não forem devolvidas dentro aspas duplas, que
  86. <classname>Zend_Json</classname> naturalmente faz. Com o suporte à Expressão no
  87. <classname>Zend_Json</classname>, você pode codificar objetos <acronym>JSON</acronym>
  88. com callbacks de javascript válidos. Isso funciona tanto para
  89. <methodname>json_encode()</methodname> quanto para o codificador interno.
  90. </para>
  91. <para>
  92. Um callback javascript é representado usando o objeto
  93. <classname>Zend_Json_Expr</classname>. Ela implementa o padrão value object e é
  94. imutável. Você pode definir a expressão javascript como o primeiro argumento do
  95. construtor. Por padrão <classname>Zend_Json::encode</classname> não codifica callbacks
  96. de javascript, você deverá passar a opção <property>enableJsonExprFinder</property> e
  97. defini-la para <constant>TRUE</constant> para a função
  98. <methodname>encode()</methodname>. Se ativado, o suporte à expressão funcionará para
  99. todas as expressões aninhadas em estruturas de grande porte. Um exemplo de uso seria
  100. parecido com:
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. $data = array(
  104. 'onClick' => new Zend_Json_Expr('function() {'
  105. . 'alert("I am a valid javascript callback '
  106. . 'created by Zend_Json"); }'),
  107. 'other' => 'no expression',
  108. );
  109. $jsonObjectWithExpression = Zend_Json::encode(
  110. $data,
  111. false,
  112. array('enableJsonExprFinder' => true)
  113. );
  114. ]]></programlisting>
  115. </sect2>
  116. </sect1>
  117. <!--
  118. vim:se ts=4 sw=4 et:
  119. -->