2
0

Zend_Json-Objects.xml 6.5 KB

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