Zend_Json-Objects.xml 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.json.advanced">
  5. <title>Advanced Usage of Zend_Json</title>
  6. <sect2 id="zend.json.advanced.objects1">
  7. <title>Объекты JSON</title>
  8. <para>
  9. Когда объекты <acronym>PHP</acronym> кодируются в <acronym>JSON</acronym>, все публичные
  10. свойства этого объекта будут кодированы в объект <acronym>JSON</acronym>.
  11. </para>
  12. <para>
  13. <acronym>JSON</acronym> не поддерживает ссылки на объекты, поэтому следите за тем, чтобы
  14. не закодировать объекты с рекурсивными ссылками. Если вы имеете дело с рекурсией, то в
  15. вызове методов <methodname>Zend_Json::encode()</methodname> и
  16. <methodname>Zend_Json_Encoder::encode()</methodname> можно установить второй
  17. необязательный параметр для проверки на рекурсию; если один и тот же объект подвергается
  18. сериализации дважды, то будет сгенерировано исключение.
  19. </para>
  20. <para>
  21. Декодирование объектов <acronym>JSON</acronym> представляет собой дополнительную
  22. сложность, так как объекты Javascript скорее соответствуют ассоциативным массивам в
  23. <acronym>PHP</acronym>. Одни советуют передавать идентификатор класса, экземпляр этого
  24. класса должен быть создан и заполнен парами ключ/значение объекта
  25. <acronym>JSON</acronym>; другие считают, что это может представлять собой серьезную
  26. угрозу безопасности.
  27. </para>
  28. <para>
  29. По умолчанию <classname>Zend_Json</classname> будет декодировать объекты
  30. <acronym>JSON</acronym> как ассоциативные массивы. Но если вы хотите получить объект,
  31. то можете указать это:
  32. </para>
  33. <programlisting language="php"><![CDATA[
  34. // Декодировать JSON объект как PHP объект
  35. $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
  36. ]]></programlisting>
  37. <para>
  38. Любые объекты, декодированные таким образом, возвращаются как
  39. объекты <classname>StdClass</classname> со свойствами, соответствующими парам
  40. ключ/значение в нотации <acronym>JSON</acronym>.
  41. </para>
  42. <para>
  43. Рекомендацией Zend Framework является то, что разрабочик
  44. должен сам принимать решение, как декодировать объект <acronym>JSON</acronym>. Если
  45. должен быть создан объект определенного типа, он может быть создан в
  46. коде разработчика и заполнен значениями, декодированными с помощью
  47. <classname>Zend_Json</classname>.
  48. </para>
  49. </sect2>
  50. <sect2 id="zend.json.advanced.objects2">
  51. <title>Кодирование объектов PHP</title>
  52. <para>
  53. Если вы кодируете объекты <acronym>PHP</acronym>, по умолчанию еханизм кодирования
  54. может получить доступ только к публичным свойствам этих объектов. Когда метод
  55. <methodname>toJson()</methodname> реализован в кодируемом объекте,
  56. <classname>Zend_Json</classname> вызывает его и ожидает возврат <acronym>JSON</acronym>
  57. представления внутреннего состояния объекта.
  58. </para>
  59. </sect2>
  60. <sect2 id="zend.json.advanced.internal">
  61. <title>Внутренний кодировщик/декодировщик</title>
  62. <para>
  63. <classname>Zend_Json</classname> имеет два разных режима, в зависимости от того,
  64. включен ext/json в вашей сборке <acronym>PHP</acronym> или нет. Если ext/json
  65. установлен, по умолчанию будут использованы функции
  66. <methodname>json_encode()</methodname> и <methodname>json_decode()</methodname>
  67. для кодирования и декодирования<acronym>JSON</acronym>.
  68. Если же ext/json не установлен, то используется имплементации Zend Framework'а на
  69. <acronym>PHP</acronym>-коде. Эта имплементация значительно медленнее, чем расширение
  70. <acronym>PHP</acronym>, но ведет себя точно так же.
  71. </para>
  72. <para>
  73. Иногда вы можете захотеть использовать внутренний кодировщик/декодировщик, даже если
  74. ext/json установлен. Вы можете добиться этого следующим способом:
  75. </para>
  76. <programlisting language="php"><![CDATA[
  77. Zend_Json::$useBuiltinEncoderDecoder = true:
  78. ]]></programlisting>
  79. </sect2>
  80. <sect2 id="zend.json.advanced.expr">
  81. <title>Выражения JSON</title>
  82. <para>
  83. Javascript широко использует анонимные функции обратного вызова, которые могут быть
  84. сохранены внутри переменных объекта <acronym>JSON</acronym>. Но они работают только
  85. если не возвращены внутри двойных кавычек, которые, естественно,
  86. <classname>Zend_Json</classname> ставит. С поддержкой выражений(Expressions) для
  87. <classname>Zend_Json</classname> вы можете кодировать объекты<acronym>JSON</acronym>,
  88. содержащие функции обратного вызова в javascript. Это работает как для
  89. <methodname>json_encode()</methodname>, так и для внутреннего кодировщика.
  90. </para>
  91. <para>
  92. Javascript функции обратного вызова представлены с использованием объекта
  93. <classname>Zend_Json_Expr</classname>. Он реализует паттерн Value Object и является не
  94. неизменяемым. Вы можете установить выражение javascript первым аргументом конструктора.
  95. По умолчанию <classname>Zend_Json::encode</classname> не кодирует javascript функции
  96. обратного вызова, вы должны передать опцию <property>enableJsonExprFinder</property>
  97. со значением <constant>TRUE</constant> в функцию <methodname>encode()</methodname>.
  98. Если включена, подержка выражений работает для всех вложенных выражений в большой
  99. объектной структуре. Пример использования выглядит так:
  100. </para>
  101. <programlisting language="php"><![CDATA[
  102. $data = array(
  103. 'onClick' => new Zend_Json_Expr('function() {'
  104. . 'alert("I am a valid javascript callback '
  105. . 'created by Zend_Json"); }'),
  106. 'other' => 'no expression',
  107. );
  108. $jsonObjectWithExpression = Zend_Json::encode(
  109. $data,
  110. false,
  111. array('enableJsonExprFinder' => true)
  112. );
  113. ]]></programlisting>
  114. </sect2>
  115. </sect1>
  116. <!--
  117. vim:se ts=4 sw=4 et:
  118. -->