Zend_Json-Objects.xml 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17175 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.advanced">
  5. <title>Fortgeschrittene Verwendung von Zend_Json</title>
  6. <sect2 id="zend.json.advanced.objects1">
  7. <title>JSON Objekte</title>
  8. <para>
  9. Bei der Kodierung von <acronym>PHP</acronym> Objekten nach JSON werden alle öffentlichen
  10. Eigenschaften dieses Objektes im JSON Objekt kodiert.
  11. </para>
  12. <para>
  13. JSON erlaubt keine Objektreferenzen, deshalb sollte dafür Sorge getragen werden, dass
  14. keine Objekte mit rekursiver Referenz kodiert werden. Wenn man Probleme mit Rekursion
  15. hat, erlauben <methodname>Zend_Json::encode()</methodname> und
  16. <methodname>Zend_Json_Encoder::encode()</methodname> die Angabe eines optionalen,
  17. zweiten Parameters, um auf Rekursion zu prüfen; wenn ein Objekt doppelt serialisiert
  18. wird, wird eine Ausnahme geworfen.
  19. </para>
  20. <para>
  21. Das Dekodieren von JSON Objekten stellt eine weitere Schwierigkeit dar, allerdings
  22. entsprechen Javascript Objekte sehr einem assoziativen Array in <acronym>PHP</acronym>.
  23. Einige schlagen vor, dass ein Klassenbezeichner übergeben werden soll und eine
  24. Objektinstanz dieser Klasse erstellt und mit den Schlüssel/Wert Paaren des JSON Objektes
  25. bestückt werden soll; andere denken, dies könnte ein erhebliches Sicherheitsrisiko
  26. darstellen.
  27. </para>
  28. <para>
  29. Standardmäßig wird <classname>Zend_Json</classname> die JSON Objekte als assoziative
  30. Arrays dekodieren. Wenn du allerdings wünscht, dass ein Objekt zurück gegeben wird,
  31. kannst du dies angeben:
  32. </para>
  33. <programlisting language="php"><![CDATA[
  34. // Dekodiere JSON Objekte als PHP Objekte
  35. $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
  36. ]]></programlisting>
  37. <para>
  38. Jedes dekodierte Objekte wird als <code>StdClass</code> Objekt mit Eigenschaften
  39. entsprechend der Schlüssel/Wert Paare der JSON Notation zuürckgegeben.
  40. </para>
  41. <para>
  42. Die Empfehlung des Zend Framework ist, dass der einzelne Entwickler selber entscheiden
  43. sollte, wie er JSON Objekte dekodiert. Wenn ein Objekt eines bestimmten Typs erstellt
  44. werden soll, kann es im Code des Entwicklers erstellt werden und mit den dekodierten
  45. Werten unter Verwendung von <classname>Zend_Json</classname> bestückt werden.
  46. </para>
  47. </sect2>
  48. <sect2 id="zend.json.advanced.objects2">
  49. <title>Kodierung von PHP Objekten</title>
  50. <para>
  51. Wenn man <acronym>PHP</acronym> Objekte kodiert, kann der Kodierungsmechanismus
  52. standardmäßig nur auf public Eigenschaften dieser Objekte zugreifen. Wenn eine Methode
  53. <methodname>toJson()</methodname> an einem Objekte für die Kodierung implementiert ist,
  54. ruft <classname>Zend_Json</classname> diese Methode auf und erwartet dass das Objekt
  55. eine JSON Repräsentation seines internen Status zurückgibt.
  56. </para>
  57. </sect2>
  58. <sect2 id="zend.json.advanced.internal">
  59. <title>Interner Encoder/Decoder</title>
  60. <para>
  61. <classname>Zend_Json</classname> hat zwei unterschiedliche Modi abhängig davon ob
  62. ext/json in der <acronym>PHP</acronym> Installation aktiviert ist oder nicht. Wenn
  63. ext/json installiert ist, werden standardmäßig die Funktionen
  64. <methodname>json_encode()</methodname> und <methodname>json_decode()</methodname> für
  65. die Kodierung und Dekodierung von JSON verwendet. Wenn ext/json nicht installiert ist
  66. wird eine Implentierung vom Zend Framework in <acronym>PHP</acronym> Code für die
  67. De-/Kodierung verwendet. Das ist naturgemäß langsamer als die Verwendung der PHP
  68. Erweiterung, verhält sich aber identisch.
  69. </para>
  70. <para>
  71. Machmal will man trotzdem den internen De-/Kodierer verwenden, selbst wenn man ext/json
  72. installiert hat. Man kann das durch folgenden Aufruf erzwingen:
  73. </para>
  74. <programlisting language="php"><![CDATA[
  75. Zend_Json::$useBuiltinEncoderDecoder = true:
  76. ]]></programlisting>
  77. </sect2>
  78. <sect2 id="zend.json.advanced.expr">
  79. <title>JSON Ausdrücke</title>
  80. <para>
  81. Javascript macht häufige Verwendung von anonymen Funktions-Callbacks, welche in
  82. JSON Objektvariablen gespeichert werden können. Trotzdem funktionieren Sie nur wenn
  83. Sie nicht in doppelten Anführungszeichen gesetzt werden, was
  84. <classname>Zend_Json</classname> natürlich macht. Mit der Unterstützung von Ausdrücken
  85. für <classname>Zend_Json</classname> können JSON Objekte mit gültigen Javascript
  86. Callbacks kodiert werden. Das funktioniert sowohl für
  87. <methodname>json_encode()</methodname> als auch den internen Kodierer.
  88. </para>
  89. <para>
  90. Ein Javascript Callback wird repräsentiert indem das
  91. <classname>Zend_Json_Expr</classname> Objekt verwendet wird. Es implementiert das
  92. Wert-Objekt Pattern und ist nicht änderbar. Man kann den Javascript Ausdruck als erstes
  93. Argument des Konstruktors setzen. Standardmäßig kodiert
  94. <classname>Zend_Json::encode</classname> keine Javascript Callbacks, wenn man die Option
  95. <code>'enableJsonExprFinder' = true</code> in der <code>encode</code> Funktion übergibt.
  96. Aktiviert, unterstützt arbeiten Ausdrücke für alle enthaltenen Ausdrücke in großen
  97. Objektstrukturen. Ein Verwendungsbeispiel würde wie folgt aussehen:
  98. </para>
  99. <programlisting language="php"><![CDATA[
  100. $data = array(
  101. 'onClick' => new Zend_Json_Expr('function() { '
  102. . 'alert("Ich bin ein gültiger Javascript Callback '
  103. . 'erstellt von Zend_Json"); }'),
  104. 'other' => 'no expression',
  105. );
  106. $jsonObjectWithExpression = Zend_Json::encode(
  107. $data,
  108. false,
  109. array('enableJsonExprFinder' => true)
  110. );
  111. ]]></programlisting>
  112. </sect2>
  113. </sect1>
  114. <!--
  115. vim:se ts=4 sw=4 et:
  116. -->