Zend_Json-Objects.xml 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.objects">
  5. <title>Utilisation avancée de Zend_Json</title>
  6. <sect2 id="zend.json.advanced.objects1">
  7. <title>Objets JSON</title>
  8. <para>
  9. Lorsque vous encodez des objets <acronym>PHP</acronym> en tant que <acronym>JSON</acronym>, toutes les propriétés publiques
  10. de cet objet sont encodées dans un objet <acronym>JSON</acronym>.
  11. </para>
  12. <para>
  13. <acronym>JSON</acronym> ne vous permet pas de référencer des objets, donc le soin devra être pris pour ne
  14. pas coder des objets avec des références récursives. Si vous avez des problèmes de
  15. récursivité, <methodname>Zend_Json::encode()</methodname> et
  16. <methodname>Zend_Json_Encoder::encode()</methodname> autorisent un deuxième paramètre
  17. facultatif afin de vérifier la récursivité ; si un objet est sérialisé deux fois, une
  18. exception sera levée.
  19. </para>
  20. <para>
  21. Bien que les objets Javascript correspondent de très près aux tableau associatifs de
  22. <acronym>PHP</acronym>, décoder des objets <acronym>JSON</acronym> pose une légère difficulté. Certains suggèrent qu'un
  23. identifiant de classe soit passé, et qu'une instance de cette classe soit créée et
  24. définie avec les paires clé/valeur des objets <acronym>JSON</acronym> ; d'autres pensent que cela pourrait
  25. poser un risque de sécurité potentiel.
  26. </para>
  27. <para>
  28. Par défaut, <classname>Zend_Json</classname> décodera des objets JSON comme en
  29. tableaux associatifs. Cependant, si vous désirez avoir un objet en retour, vous pouvez le
  30. spécifier : <programlisting language="php"><![CDATA[
  31. // Décode des objets JSON en tant qu'objets PHP
  32. $phpNatif = Zend_Json::decode($valeurEncodee, Zend_Json::TYPE_OBJECT);
  33. ]]></programlisting> Tous les objets sont ainsi décodés et retournés comme des objets de type
  34. <code>StdClass</code>, avec leurs propriétés correspondantes aux paires clé/valeur de la
  35. notation JSON.
  36. </para>
  37. <para>
  38. La recommandation de Zend Framework est que le développeur doit décider comment
  39. décoder les objets <acronym>JSON</acronym>. Si un objet d'un type spécifié doit être créé, il peut être créé
  40. dans le code du développeur et définit avec les valeurs décodées en utilisant
  41. <classname>Zend_Json</classname>.
  42. </para>
  43. </sect2>
  44. <sect2 id="zend.json.advanced.objects2">
  45. <title>Encoding PHP objects</title>
  46. <para>
  47. If you are encoding <acronym>PHP</acronym> objects by default the encoding mechanism
  48. can only access public properties of these objects. When a method
  49. <methodname>toJson()</methodname> is implemented on an object to encode,
  50. <classname>Zend_Json</classname> calls this method and expects the object to return a
  51. <acronym>JSON</acronym> representation of its internal state.
  52. </para>
  53. </sect2>
  54. <sect2 id="zend.json.advanced.internal">
  55. <title>Internal Encoder/Decoder</title>
  56. <para>
  57. Zend_Json has two different modes depending if ext/json is enabled in
  58. your <acronym>PHP</acronym> installation or not. If ext/json is installed by default
  59. <methodname>json_encode()</methodname> and <methodname>json_decode()</methodname> functions
  60. are used for encoding and decoding <acronym>JSON</acronym>. If ext/json is not installed
  61. a Zend Framework implementation in <acronym>PHP</acronym> code is used for en-/decoding.
  62. This is considerably slower than using the php extension, but behaves
  63. exactly the same.
  64. </para>
  65. <para>
  66. Still sometimes you might want to use the internal encoder/decoder even
  67. if you have ext/json installed. You can achieve this by calling:
  68. </para>
  69. <programlisting language="php"><![CDATA[
  70. Zend_Json::$useBuiltinEncoderDecoder = true:
  71. ]]></programlisting>
  72. </sect2>
  73. <sect2 id="zend.json.advanced.expr">
  74. <title>JSON Expressions</title>
  75. <para>
  76. Javascript makes heavy use of anonymnous function callbacks, which
  77. can be saved within <acronym>JSON</acronym> object variables. Still they only work if not
  78. returned inside double qoutes, which <classname>Zend_Json</classname> naturally does.
  79. With the Expression support for Zend_Json support you can encode <acronym>JSON</acronym>
  80. objects with valid javascript callbacks. This works for both <methodname>json_encode()</methodname>
  81. or the internal encoder.
  82. </para>
  83. <para>
  84. A javascript callback is represented using the <classname>Zend_Json_Expr</classname>
  85. object. It implements the value object pattern and is immutable. You can set the
  86. javascript expression as the first constructor argument. By default
  87. <classname>Zend_Json::encode</classname> does not encode javascript callbacks, you have
  88. to pass the option <code>'enableJsonExprFinder' = true</code> into the
  89. <code>encode</code> function. If enabled the expression support works for all nested
  90. expressions in large object structures. A usage example would look like:
  91. </para>
  92. <programlisting language="php"><![CDATA[
  93. $data = array(
  94. 'onClick' => new Zend_Json_Expr('function() {'
  95. . 'alert("I am a valid javascript callback '
  96. . 'created by Zend_Json"); }'),
  97. 'other' => 'no expression',
  98. );
  99. $jsonObjectWithExpression = Zend_Json::encode(
  100. $data,
  101. false,
  102. array('enableJsonExprFinder' => true)
  103. );
  104. ]]></programlisting>
  105. </sect2>
  106. </sect1>