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