Zend_Json-Objects.xml 5.9 KB

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