| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 17175 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.json.advanced">
- <title>Fortgeschrittene Verwendung von Zend_Json</title>
- <sect2 id="zend.json.advanced.objects1">
- <title>JSON Objekte</title>
- <para>
- Bei der Kodierung von <acronym>PHP</acronym> Objekten nach JSON werden alle öffentlichen
- Eigenschaften dieses Objektes im JSON Objekt kodiert.
- </para>
- <para>
- JSON erlaubt keine Objektreferenzen, deshalb sollte dafür Sorge getragen werden, dass
- keine Objekte mit rekursiver Referenz kodiert werden. Wenn man Probleme mit Rekursion
- hat, erlauben <methodname>Zend_Json::encode()</methodname> und
- <methodname>Zend_Json_Encoder::encode()</methodname> die Angabe eines optionalen,
- zweiten Parameters, um auf Rekursion zu prüfen; wenn ein Objekt doppelt serialisiert
- wird, wird eine Ausnahme geworfen.
- </para>
- <para>
- Das Dekodieren von JSON Objekten stellt eine weitere Schwierigkeit dar, allerdings
- entsprechen Javascript Objekte sehr einem assoziativen Array in <acronym>PHP</acronym>.
- Einige schlagen vor, dass ein Klassenbezeichner übergeben werden soll und eine
- Objektinstanz dieser Klasse erstellt und mit den Schlüssel/Wert Paaren des JSON Objektes
- bestückt werden soll; andere denken, dies könnte ein erhebliches Sicherheitsrisiko
- darstellen.
- </para>
- <para>
- Standardmäßig wird <classname>Zend_Json</classname> die JSON Objekte als assoziative
- Arrays dekodieren. Wenn du allerdings wünscht, dass ein Objekt zurück gegeben wird,
- kannst du dies angeben:
- </para>
- <programlisting language="php"><![CDATA[
- // Dekodiere JSON Objekte als PHP Objekte
- $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
- ]]></programlisting>
- <para>
- Jedes dekodierte Objekte wird als <code>StdClass</code> Objekt mit Eigenschaften
- entsprechend der Schlüssel/Wert Paare der JSON Notation zuürckgegeben.
- </para>
- <para>
- Die Empfehlung des Zend Framework ist, dass der einzelne Entwickler selber entscheiden
- sollte, wie er JSON Objekte dekodiert. Wenn ein Objekt eines bestimmten Typs erstellt
- werden soll, kann es im Code des Entwicklers erstellt werden und mit den dekodierten
- Werten unter Verwendung von <classname>Zend_Json</classname> bestückt werden.
- </para>
- </sect2>
- <sect2 id="zend.json.advanced.objects2">
- <title>Kodierung von PHP Objekten</title>
- <para>
- Wenn man <acronym>PHP</acronym> Objekte kodiert, kann der Kodierungsmechanismus
- standardmäßig nur auf public Eigenschaften dieser Objekte zugreifen. Wenn eine Methode
- <methodname>toJson()</methodname> an einem Objekte für die Kodierung implementiert ist,
- ruft <classname>Zend_Json</classname> diese Methode auf und erwartet dass das Objekt
- eine JSON Repräsentation seines internen Status zurückgibt.
- </para>
- </sect2>
- <sect2 id="zend.json.advanced.internal">
- <title>Interner Encoder/Decoder</title>
- <para>
- <classname>Zend_Json</classname> hat zwei unterschiedliche Modi abhängig davon ob
- ext/json in der <acronym>PHP</acronym> Installation aktiviert ist oder nicht. Wenn
- ext/json installiert ist, werden standardmäßig die Funktionen
- <methodname>json_encode()</methodname> und <methodname>json_decode()</methodname> für
- die Kodierung und Dekodierung von JSON verwendet. Wenn ext/json nicht installiert ist
- wird eine Implentierung vom Zend Framework in <acronym>PHP</acronym> Code für die
- De-/Kodierung verwendet. Das ist naturgemäß langsamer als die Verwendung der PHP
- Erweiterung, verhält sich aber identisch.
- </para>
- <para>
- Machmal will man trotzdem den internen De-/Kodierer verwenden, selbst wenn man ext/json
- installiert hat. Man kann das durch folgenden Aufruf erzwingen:
- </para>
- <programlisting language="php"><![CDATA[
- Zend_Json::$useBuiltinEncoderDecoder = true:
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.json.advanced.expr">
- <title>JSON Ausdrücke</title>
- <para>
- Javascript macht häufige Verwendung von anonymen Funktions-Callbacks, welche in
- JSON Objektvariablen gespeichert werden können. Trotzdem funktionieren Sie nur wenn
- Sie nicht in doppelten Anführungszeichen gesetzt werden, was
- <classname>Zend_Json</classname> natürlich macht. Mit der Unterstützung von Ausdrücken
- für <classname>Zend_Json</classname> können JSON Objekte mit gültigen Javascript
- Callbacks kodiert werden. Das funktioniert sowohl für
- <methodname>json_encode()</methodname> als auch den internen Kodierer.
- </para>
- <para>
- Ein Javascript Callback wird repräsentiert indem das
- <classname>Zend_Json_Expr</classname> Objekt verwendet wird. Es implementiert das
- Wert-Objekt Pattern und ist nicht änderbar. Man kann den Javascript Ausdruck als erstes
- Argument des Konstruktors setzen. Standardmäßig kodiert
- <classname>Zend_Json::encode</classname> keine Javascript Callbacks, wenn man die Option
- <code>'enableJsonExprFinder' = true</code> in der <code>encode</code> Funktion übergibt.
- Aktiviert, unterstützt arbeiten Ausdrücke für alle enthaltenen Ausdrücke in großen
- Objektstrukturen. Ein Verwendungsbeispiel würde wie folgt aussehen:
- </para>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'onClick' => new Zend_Json_Expr('function() { '
- . 'alert("Ich bin ein gültiger Javascript Callback '
- . 'erstellt von Zend_Json"); }'),
- 'other' => 'no expression',
- );
- $jsonObjectWithExpression = Zend_Json::encode(
- $data,
- false,
- array('enableJsonExprFinder' => true)
- );
- ]]></programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|