|
|
@@ -1,84 +1,136 @@
|
|
|
-<sect1 id="zend.json.objects">
|
|
|
- <title>Объекты JSON</title>
|
|
|
- <para>
|
|
|
- Когда объекты PHP закодировываются в JSON, все публичные свойства этого
|
|
|
- объекта будут закодированы в объект JSON.
|
|
|
-<!--
|
|
|
- When encoding PHP objects as JSON, all public properties of that object
|
|
|
- will be encoded in a JSON object.
|
|
|
--->
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- JSON не поддерживает ссылки на объекты, поэтому следите за тем, чтобы
|
|
|
- не закодировывать объекты с рекурсивными ссылками. Если вы имеете дело
|
|
|
- с рекурсией, то в вызове методов <code>Zend_Json::encode()</code> и
|
|
|
- <code>Zend_Json_Encoder::encode()</code> можно установить второй
|
|
|
- необязательный параметр для проверки на рекурсию; если один и тот же
|
|
|
- объект подвергается сериализации дважды, то будет сгенерировано
|
|
|
- исключение.
|
|
|
-<!--
|
|
|
- JSON does not allow object references, so care should be taken not to
|
|
|
- encode objects with recursive references. If you have issues with
|
|
|
- recursion, <code>Zend_Json::encode()</code> and
|
|
|
- <code>Zend_Json_Encoder::encode()</code> allow an optional second
|
|
|
- parameter to check for recursion; if an object is serialized twice, an
|
|
|
- exception will be thrown.
|
|
|
--->
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Декодирование объектов JSON представляет собой дополнительную сложность,
|
|
|
- так как объекты Javascript скорее соответствуют ассоциативным массивам в
|
|
|
- PHP. Одни советуют передавать идентификатор класса, экземпляр этого
|
|
|
- класса должен быть создан и заполнен парами ключ/значение объекта JSON;
|
|
|
- другие считают, что это может представлять собой серьезную угрозу
|
|
|
- безопасности.
|
|
|
-<!--
|
|
|
- Decoding JSON objects poses an additional difficulty, however, since
|
|
|
- Javascript objects correspond most closesly to PHP's associative array.
|
|
|
- Some suggest that a class identifier should be passed, and an object
|
|
|
- instance of that class should be created and populated with the
|
|
|
- key/value pairs of the JSON object; others feel this could pose a
|
|
|
- substantial security risk.
|
|
|
--->
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- По умолчанию <code>Zend_Json</code> будет декодировать объекты JSON как
|
|
|
- ассоциативные массивы. Но если вы хотите получить объект, то можете
|
|
|
- указать это:
|
|
|
-<!--
|
|
|
- By default, <code>Zend_Json</code> will decode JSON objects as
|
|
|
- associative arrays. However, if you desire an object returned, you can
|
|
|
- specify this:
|
|
|
--->
|
|
|
- </para>
|
|
|
- <programlisting language="php"><![CDATA[<?php
|
|
|
-// Декодировать объект как объект
|
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
|
+<!-- EN-Revision: 22747 -->
|
|
|
+<!-- Reviewed: no -->
|
|
|
+<sect1 id="zend.json.advanced">
|
|
|
+ <title>Advanced Usage of Zend_Json</title>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.objects1">
|
|
|
+ <title>Объекты JSON</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Когда объекты <acronym>PHP</acronym> кодируются в <acronym>JSON</acronym>, все публичные
|
|
|
+ свойства этого объекта будут кодированы в объект <acronym>JSON</acronym>.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ <acronym>JSON</acronym> не поддерживает ссылки на объекты, поэтому следите за тем, чтобы
|
|
|
+ не закодировать объекты с рекурсивными ссылками. Если вы имеете дело с рекурсией, то в
|
|
|
+ вызове методов <methodname>Zend_Json::encode()</methodname> и
|
|
|
+ <methodname>Zend_Json_Encoder::encode()</methodname> можно установить второй
|
|
|
+ необязательный параметр для проверки на рекурсию; если один и тот же объект подвергается
|
|
|
+ сериализации дважды, то будет сгенерировано исключение.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Декодирование объектов <acronym>JSON</acronym> представляет собой дополнительную
|
|
|
+ сложность, так как объекты Javascript скорее соответствуют ассоциативным массивам в
|
|
|
+ <acronym>PHP</acronym>. Одни советуют передавать идентификатор класса, экземпляр этого
|
|
|
+ класса должен быть создан и заполнен парами ключ/значение объекта
|
|
|
+ <acronym>JSON</acronym>; другие считают, что это может представлять собой серьезную
|
|
|
+ угрозу безопасности.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ По умолчанию <classname>Zend_Json</classname> будет декодировать объекты
|
|
|
+ <acronym>JSON</acronym> как ассоциативные массивы. Но если вы хотите получить объект,
|
|
|
+ то можете указать это:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+// Декодировать JSON объект как PHP объект
|
|
|
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
|
|
|
-?>]]></programlisting>
|
|
|
- <para>
|
|
|
- Любые объекты, декодированные таким образом, возвращаются как
|
|
|
- объекты <code>StdClass</code> со свойствами, соответствующими парам
|
|
|
- ключ/значение в нотации JSON.
|
|
|
-<!--
|
|
|
- Any objects thus decoded are returned as <code>StdClass</code> objects
|
|
|
- with properties corresponding to the key/value pairs in the JSON
|
|
|
- notation.
|
|
|
--->
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Рекомендацией Zend Framework является то, что разрабочик
|
|
|
- должен сам принимать решение, как декодировать объект JSON. Если
|
|
|
- должен быть создан объект определенного типа, он может быть создан в
|
|
|
- коде разработчика и заполнен значениями, декодированными с помощью
|
|
|
- <code>Zend_Json</code>.
|
|
|
-<!--
|
|
|
- The recommendation of Zend Framework is that the individual
|
|
|
- developer should decide how to decode JSON objects. If an object of a
|
|
|
- specified type should be created, it can be created in the developer
|
|
|
- code and populated with the values decoded using <code>Zend_Json</code>.
|
|
|
--->
|
|
|
- </para>
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Любые объекты, декодированные таким образом, возвращаются как
|
|
|
+ объекты <classname>StdClass</classname> со свойствами, соответствующими парам
|
|
|
+ ключ/значение в нотации <acronym>JSON</acronym>.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Рекомендацией Zend Framework является то, что разрабочик
|
|
|
+ должен сам принимать решение, как декодировать объект <acronym>JSON</acronym>. Если
|
|
|
+ должен быть создан объект определенного типа, он может быть создан в
|
|
|
+ коде разработчика и заполнен значениями, декодированными с помощью
|
|
|
+ <classname>Zend_Json</classname>.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.objects2">
|
|
|
+ <title>Кодирование объектов PHP</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Если вы кодируете объекты <acronym>PHP</acronym>, по умолчанию еханизм кодирования
|
|
|
+ может получить доступ только к публичным свойствам этих объектов. Когда метод
|
|
|
+ <methodname>toJson()</methodname> реализован в кодируемом объекте,
|
|
|
+ <classname>Zend_Json</classname> вызывает его и ожидает возврат <acronym>JSON</acronym>
|
|
|
+ представления внутреннего состояния объекта.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.internal">
|
|
|
+ <title>Внутренний кодировщик/декодировщик</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ <classname>Zend_Json</classname> имеет два разных режима, в зависимости от того,
|
|
|
+ включен ext/json в вашей сборке <acronym>PHP</acronym> или нет. Если ext/json
|
|
|
+ установлен, по умолчанию будут использованы функции
|
|
|
+ <methodname>json_encode()</methodname> и <methodname>json_decode()</methodname>
|
|
|
+ для кодирования и декодирования<acronym>JSON</acronym>.
|
|
|
+ Если же ext/json не установлен, то используется имплементации Zend Framework'а на
|
|
|
+ <acronym>PHP</acronym>-коде. Эта имплементация значительно медленнее, чем расширение
|
|
|
+ <acronym>PHP</acronym>, но ведет себя точно так же.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Иногда вы можете захотеть использовать внутренний кодировщик/декодировщик, даже если
|
|
|
+ ext/json установлен. Вы можете добиться этого следующим способом:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+Zend_Json::$useBuiltinEncoderDecoder = true:
|
|
|
+]]></programlisting>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="zend.json.advanced.expr">
|
|
|
+ <title>Выражения JSON</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Javascript широко использует анонимные функции обратного вызова, которые могут быть
|
|
|
+ сохранены внутри переменных объекта <acronym>JSON</acronym>. Но они работают только
|
|
|
+ если не возвращены внутри двойных кавычек, которые, естественно,
|
|
|
+ <classname>Zend_Json</classname> ставит. С поддержкой выражений(Expressions) для
|
|
|
+ <classname>Zend_Json</classname> вы можете кодировать объекты<acronym>JSON</acronym>,
|
|
|
+ содержащие функции обратного вызова в javascript. Это работает как для
|
|
|
+ <methodname>json_encode()</methodname>, так и для внутреннего кодировщика.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Javascript функции обратного вызова представлены с использованием объекта
|
|
|
+ <classname>Zend_Json_Expr</classname>. Он реализует паттерн Value Object и является не
|
|
|
+ неизменяемым. Вы можете установить выражение javascript первым аргументом конструктора.
|
|
|
+ По умолчанию <classname>Zend_Json::encode</classname> не кодирует javascript функции
|
|
|
+ обратного вызова, вы должны передать опцию <property>enableJsonExprFinder</property>
|
|
|
+ со значением <constant>TRUE</constant> в функцию <methodname>encode()</methodname>.
|
|
|
+ Если включена, подержка выражений работает для всех вложенных выражений в большой
|
|
|
+ объектной структуре. Пример использования выглядит так:
|
|
|
+ </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>
|
|
|
<!--
|
|
|
vim:se ts=4 sw=4 et:
|
|
|
--->
|
|
|
+-->
|