Zend_Db_Table_Row.xml 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <sect1 id="zend.db.table.row">
  2. <title>Zend_Db_Table_Row</title>
  3. <sect2 id="zend.db.table.row.introduction">
  4. <title>Введение</title>
  5. <para>
  6. Zend_Db_Table_Row является классом, содержащим отдельную строку
  7. объекта Zend_Db_Table. Когда вы производите запрос через класс
  8. таблицы, результат возвращается в виде набора объектов
  9. Zend_Db_Table_Row. Вы можете также использовать этот объект для
  10. создания новых строк и их добавления в таблицу БД.
  11. </para>
  12. <para>
  13. Zend_Db_Table_Row является реализацией паттерна
  14. <ulink url="http://www.martinfowler.com/eaaCatalog/rowDataGateway.html">Row Data Gateway</ulink>.
  15. </para>
  16. </sect2>
  17. <sect2 id="zend.db.table.row.read">
  18. <title>Извлечение строки</title>
  19. <para>
  20. Zend_Db_Table_Abstract предоставляет методы <code>find()</code> и
  21. <code>fetchAll()</code>, которые возвращают объект типа
  22. Zend_Db_Table_Rowset, и метод <code>fetchRow()</code>, возвращающий
  23. объект типа Zend_Db_Table_Row.
  24. </para>
  25. <example id="zend.db.table.row.read.example">
  26. <title>Пример извлечения строки</title>
  27. <programlisting language="php"><![CDATA[
  28. $bugs = new Bugs();
  29. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
  30. ]]>
  31. </programlisting>
  32. </example>
  33. <para>
  34. Объект Zend_Db_Table_Rowset содержит коллекцию объектов
  35. Zend_Db_Table_Row. Для получения более подробной информации
  36. читайте <xref linkend="zend.db.table.rowset" />.
  37. </para>
  38. <example id="zend.db.table.row.read.example-rowset">
  39. <title>Пример получения строки из набора строк</title>
  40. <programlisting language="php"><![CDATA[
  41. $bugs = new Bugs();
  42. $rowset = $bugs->fetchAll($bugs->select()->where('bug_status = ?', 1));
  43. $row = $rowset->current();
  44. ]]>
  45. </programlisting>
  46. </example>
  47. <sect3 id="zend.db.table.row.read.get">
  48. <title>Чтение значений столбцов из строки</title>
  49. <para>
  50. Zend_Db_Table_Row_Abstract предоставляет методы-аксессоры,
  51. благодаря которым можно ссылаться на столбцы в строке как на
  52. свойства объекта.
  53. </para>
  54. <example id="zend.db.table.row.read.get.example">
  55. <title>Пример чтения столбца из строки</title>
  56. <programlisting language="php"><![CDATA[
  57. $bugs = new Bugs();
  58. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
  59. // Вывод значения столбца bug_description
  60. echo $row->bug_description;
  61. ]]>
  62. </programlisting>
  63. </example>
  64. <note>
  65. <para>
  66. Более ранние версии Zend_Db_Table_Row сопоставляли
  67. аксессоры столбцов и имена столбцов в БД с использованием
  68. преобразования строк, называемым
  69. <emphasis>инфлекцией</emphasis>.
  70. </para>
  71. <para>
  72. Zend_Db_Table_Row в его текущей реализации не использует
  73. инфлекцию. Написание аксессоров столбцов должно в точности
  74. соответствовать именам столбцов, так, как они представлены в
  75. БД.
  76. </para>
  77. </note>
  78. </sect3>
  79. <sect3 id="zend.db.table.row.read.to-array">
  80. <title>Получение данных строки в виде массива</title>
  81. <para>
  82. Вы можете получать данные строки, используя метод
  83. <code>toArray()</code> объекта строки. Метод возвращает
  84. ассоциативный массив имен столбцов и их значений.
  85. </para>
  86. <example id="zend.db.table.row.read.to-array.example">
  87. <title>Пример использования метода toArray()</title>
  88. <programlisting language="php"><![CDATA[
  89. $bugs = new Bugs();
  90. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
  91. // Получение ассоциативного массива столбцов и их значений из объекта Row
  92. $rowArray = $row->toArray();
  93. // Теперь используется как обычный массив
  94. foreach ($rowArray as $column => $value) {
  95. echo "Column: $column\n";
  96. echo "Value: $value\n";
  97. }
  98. ]]>
  99. </programlisting>
  100. </example>
  101. <para>
  102. Массив, возвращаемый методом <code>toArray()</code> не может
  103. использоваться для обновления данных в БД. Мы можете изменять
  104. значения в этом массиве так же, как и в любом другом массиве, но
  105. не можете сохранять измененные значения непосредственно из этого
  106. массива в БД.
  107. </para>
  108. </sect3>
  109. <sect3 id="zend.db.table.row.read.relationships">
  110. <title>Извлечение данных из связанных таблиц</title>
  111. <para>
  112. Класс Zend_Db_Table_Row_Abstract предоставляет методы для
  113. извлечения строк и наборов строк из связанных таблиц.
  114. Читайте <xref linkend="zend.db.table.relationships" /> для
  115. получения более подробной информации о связях между таблицами.
  116. </para>
  117. </sect3>
  118. </sect2>
  119. <sect2 id="zend.db.table.row.write">
  120. <title>Редактирование строк в БД</title>
  121. <sect3 id="zend.db.table.row.write.set">
  122. <title>Изменение значений столбцов в строке</title>
  123. <para>
  124. Используя аксессоры столбцов, вы можете устанавливать значения
  125. отдельных столбцов по аналогии с чтением, т.е. так же, как если
  126. бы они были свойствами объекта.
  127. </para>
  128. <para>
  129. Использование аксессоров столбцов для установки значений
  130. изменяет значения столбцов в данном объекте строки, но
  131. эти изменения еще не фиксируются в БД. Вы можете произвести
  132. фиксацию через метод <code>save()</code>.
  133. </para>
  134. <example id="zend.db.table.row.write.set.example">
  135. <title>Пример изменения значения столбца в строке</title>
  136. <programlisting language="php"><![CDATA[
  137. $bugs = new Bugs();
  138. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
  139. // Изменение значения одного или более столбцов
  140. $row->bug_status = 'FIXED';
  141. // Обновление строки в БД с новыми значениями
  142. $row->save();
  143. ]]>
  144. </programlisting>
  145. </example>
  146. </sect3>
  147. <sect3 id="zend.db.table.row.write.insert">
  148. <title>Вставка новой строки</title>
  149. <para>
  150. Вы можете создавать новые строки для определенной таблицы с
  151. помощью метода <code>createRow()</code> класса таблицы. Можно
  152. работать с полями этой строки через объектно-ориентированный
  153. интерфейс, но строка не сохраняется в БД до тех пор, пока вы не
  154. вызовете метод <code>save()</code>.
  155. </para>
  156. <example id="zend.db.table.row.write.insert.example">
  157. <title>Пример создания новой строки таблицы</title>
  158. <programlisting language="php"><![CDATA[
  159. $bugs = new Bugs();
  160. $newRow = $bugs->createRow();
  161. // Установка значений столбцов
  162. $newRow->bug_description = '...description...';
  163. $newRow->bug_status = 'NEW';
  164. // Вставка новой строки в БД
  165. $newRow->save();
  166. ]]>
  167. </programlisting>
  168. </example>
  169. <para>
  170. Опциональный аргумент метода является ассоциативным массивом,
  171. через который вы можете заполнить поля новой строки.
  172. </para>
  173. <example id="zend.db.table.row.write.insert.example2">
  174. <title>Пример заполнения новой строки для таблицы</title>
  175. <programlisting language="php"><![CDATA[
  176. $data = array(
  177. 'bug_description' => '...description...',
  178. 'bug_status' => 'NEW'
  179. );
  180. $bugs = new Bugs();
  181. $newRow = $bugs->createRow($data);
  182. // вставка новой строки в БД
  183. $newRow->save();
  184. ]]>
  185. </programlisting>
  186. </example>
  187. <note>
  188. <para>
  189. В более ранних релизах Zend_Db_Table метод
  190. <code>createRow()</code> назывался <code>fetchNew()</code>.
  191. Мы рекомендуем использовать новое имя метода,
  192. несмотря на то, что старое имя метода по-прежнему работает
  193. в целях обеспечения обратной совместимости.
  194. </para>
  195. </note>
  196. </sect3>
  197. <sect3 id="zend.db.table.row.write.set-from-array">
  198. <title>Изменение значений в нескольких столбцах</title>
  199. <para>
  200. Zend_Db_Table_Row_Abstract предоставляет метод
  201. <code>setFromArray()</code> для того, чтобы можно было
  202. устанавливать значения нескольких столбцов одновременно,
  203. определив ассоциативный массив имен столбцов и их значений.
  204. Этот метод может быть удобным как при создании новых строк, так
  205. и при обновлении существующих.
  206. </para>
  207. <example id="zend.db.table.row.write.set-from-array.example">
  208. <title>Пример использования метода setFromArray() для установки
  209. значений в новой строке</title>
  210. <programlisting language="php"><![CDATA[
  211. $bugs = new Bugs();
  212. $newRow = $bugs->createRow();
  213. // Данные помещаются в ассоциативный массив
  214. $data = array(
  215. 'bug_description' => '...description...',
  216. 'bug_status' => 'NEW'
  217. );
  218. // Одновременная установка значений всех столбцов
  219. $newRow->setFromArray($data);
  220. // Добавление новой строки в БД
  221. $newRow->save();
  222. ]]>
  223. </programlisting>
  224. </example>
  225. </sect3>
  226. <sect3 id="zend.db.table.row.write.delete">
  227. <title>Удаление строки</title>
  228. <para>
  229. Вы можете использовать метод <code>delete()</code> объекта
  230. строки. Этот метод удаляет из таблицы строки, соответствующие
  231. первичному ключу в объекте строки.
  232. </para>
  233. <example id="zend.db.table.row.write.delete.example">
  234. <title>Пример удаления строки</title>
  235. <programlisting language="php"><![CDATA[
  236. $bugs = new Bugs();
  237. $row = $bugs->fetchRow('bug_id = 1');
  238. // Удаление строки
  239. $row->delete();
  240. ]]>
  241. </programlisting>
  242. </example>
  243. <para>
  244. Не нужно вызывать метод <code>save()</code> для фиксации
  245. удаления, оно сразу выполняется в БД.
  246. </para>
  247. </sect3>
  248. </sect2>
  249. <sect2 id="zend.db.table.row.serialize">
  250. <title>Сериализация и десериализация строк</title>
  251. <para>
  252. Часто бывает удобным сохранять содержимое строки БД для последующего
  253. использования. <emphasis>Сериализацией</emphasis> называется
  254. действие по преобразованию объекта в форму, удобную для хранения в
  255. автономном хранилище (например, в файле). Объекты типа
  256. Zend_Db_Table_Row_Abstract доступны для сериализации.
  257. </para>
  258. <sect3 id="zend.db.table.row.serialize.serializing">
  259. <title>Сериализация объекта строки</title>
  260. <para>
  261. Просто используйте функцию PHP <code>serialize()</code> для
  262. получения строки, содержащей представление объекта Row в виде
  263. последовательности байт.
  264. </para>
  265. <example id="zend.db.table.row.serialize.serializing.example">
  266. <title>Пример сериализации объекта строки</title>
  267. <programlisting language="php"><![CDATA[
  268. $bugs = new Bugs();
  269. $row = $bugs->fetchRow('bug_id = 1');
  270. // Преобразование объекта в сериализованную форму
  271. $serializedRow = serialize($row);
  272. // Теперь вы можете записать $serializedRow в файл и т.д.
  273. ]]>
  274. </programlisting>
  275. </example>
  276. </sect3>
  277. <sect3 id="zend.db.table.row.serialize.unserializing">
  278. <title>Десериализация данных строки</title>
  279. <para>
  280. Используйте функцию <code>unserialize()</code> для
  281. восстановления из строки, содержащей представление объекта в
  282. виде последовательности байт. Эта функция возвращает исходный объект.
  283. </para>
  284. <para>
  285. Внимание: объект строки возвращается
  286. <emphasis>без соединения</emphasis>. Вы можете читать объект Row
  287. и его свойства, но не можете изменять значения в строке или
  288. выполнять другие методы, требующие соединения с БД (например,
  289. запросы к связанным таблицам).
  290. </para>
  291. <example id="zend.db.table.row.serialize.unserializing.example">
  292. <title>Пример десериализации объекта строки</title>
  293. <programlisting language="php"><![CDATA[
  294. $rowClone = unserialize($serializedRow);
  295. // Теперь вы можете использовать свойства объекта, но только для чтения
  296. echo $rowClone->bug_description;
  297. ]]>
  298. </programlisting>
  299. </example>
  300. <note>
  301. <title>Почему объекты строки десериализуются без соединения?</title>
  302. <para>
  303. Сериализованный объект является строкой, которая доступна
  304. для чтения всем, кто ею обладает.
  305. Это создает угрозу безопасности, которая состоит в
  306. том, что в сериализованной строке сохраняются такие
  307. параметры, как логин и пароль для соединения с БД, в
  308. незашифрованном виде.
  309. Для вас может быть нежелательным сохранять такие данные в
  310. незащищенном текстовом файле, отправлять его через e-mail
  311. или любой другой носитель, который может быть прочитан
  312. потенциальным атакующим.
  313. Тот, кто прочитает сериализованный объект, не должен иметь
  314. возможности использовать его в получении
  315. несанкционированного доступа к БД.
  316. </para>
  317. </note>
  318. </sect3>
  319. <sect3 id="zend.db.table.row.serialize.set-table">
  320. <title>Восстановление соединения для объекта строки</title>
  321. <para>
  322. Вы можете восстановить соединение для строки, используя метод
  323. <code>setTable()</code>. Аргументом этого метода является объект
  324. типа Zend_Db_Table_Abstract, который создается вами. Создание
  325. объекта таблицы требует действующего соединения с БД, поэтому
  326. при переустановке таблицы объект строки получает доступ к БД.
  327. После этого можно изменять значения в объекте строки и
  328. сохранять изменения в БД.
  329. </para>
  330. <example id="zend.db.table.row.serialize.set-table.example">
  331. <title>Пример восстановления соединения для строки</title>
  332. <programlisting language="php"><![CDATA[
  333. $rowClone = unserialize($serializedRow);
  334. $bugs = new Bugs();
  335. // Привязка строки к таблице с действующим соединением БД
  336. $rowClone->setTable($bugs);
  337. // Теперь вы можете производить изменения в строке и сохранять их
  338. $rowClone->bug_status = 'FIXED';
  339. $rowClone->save();
  340. ]]>
  341. </programlisting>
  342. </example>
  343. </sect3>
  344. </sect2>
  345. <sect2 id="zend.db.table.row.extending">
  346. <title>Расширение класса строки</title>
  347. <para>
  348. Zend_Db_Table_Row является используемым по умолчанию классом,
  349. который наследует от Zend_Db_Table_Row_Abstract. Вы можете
  350. определить свой собственный класс для экземпляров строк путем
  351. наследования от Zend_Db_Table_Row_Abstract. Для того, чтобы этот
  352. класс использовался для хранения результатов запросов к таблице,
  353. укажите его имя в защищенном свойстве <varname>$_rowClass</varname>
  354. класса таблицы или в массиве, передаваемом в качестве аргумента
  355. конструктору объекта таблицы.
  356. </para>
  357. <example id="zend.db.table.row.extending.example">
  358. <title>Указание своего класса строки</title>
  359. <programlisting language="php"><![CDATA[
  360. class MyRow extends Zend_Db_Table_Row_Abstract
  361. {
  362. // ...кастомизация
  363. }
  364. // Укажите свой класс строки в качестве используемого по умолчанию
  365. // во всех экземплярах класса таблицы
  366. class Products extends Zend_Db_Table_Abstract
  367. {
  368. protected $_name = 'products';
  369. protected $_rowClass = 'MyRow';
  370. }
  371. // Или укажите свой класс строки для использования
  372. // в конкретном экземпляре класса таблицы
  373. $bugs = new Bugs(array('rowClass' => 'MyRow'));
  374. ]]>
  375. </programlisting>
  376. </example>
  377. <sect3 id="zend.db.table.row.extending.overriding">
  378. <title>Инициализация строки</title>
  379. <para>
  380. Если при создании объекта строки требуется выполнять код,
  381. реализующий логику приложения, то вы можете поместить этот код в
  382. метод <code>init()</code>, который вызывается после того,
  383. как были обработаны все метаданные строки. Рекомендуется
  384. использовать этот способ вместо переопределения метода
  385. <code>__construct</code>, если только не требуется изменять
  386. метаданные программным путем.
  387. <example id="zend.db.table.row.init.usage.example">
  388. <title>Пример использования метода init()</title>
  389. <programlisting language="php"><![CDATA[
  390. class MyApplicationRow extends Zend_Db_Table_Row_Abstract
  391. {
  392. protected $_role;
  393. public function init()
  394. {
  395. $this->_role = new MyRoleClass();
  396. }
  397. }
  398. ]]>
  399. </programlisting>
  400. </example>
  401. </para>
  402. </sect3>
  403. <sect3 id="zend.db.table.row.extending.insert-update">
  404. <title>Определение собственной логики для добавления, обновления и удаления в Zend_Db_Table_Row</title>
  405. <para>
  406. Класс строки вызывает защищенные методы <code>_insert()</code>,
  407. <code>_update()</code> и <code>_delete()</code> до выполнения
  408. соответствующих операций <code>INSERT</code>,
  409. <code>UPDATE</code> и <code>DELETE</code>. Вы можете добавлять
  410. собственную логику в эти методы в созданном вами подклассе
  411. строки.
  412. </para>
  413. <para>
  414. Если нужно выполнение собственной логики в определенной
  415. таблице, и эта логика должна выполняться для каждой операции в
  416. этой таблице, то разумным решением может быть реализация
  417. собственной логики в методах <code>insert()</code>,
  418. <code>update()</code> и <code>delete()</code> вашего класса
  419. таблицы. Тем не менее, иногда может быть необходимым выполнять
  420. собственную логику в классе строки.
  421. </para>
  422. <para>
  423. Ниже приведены примеры случаев, в которых имеет смысл
  424. реализовать свою логику в классе строки вместо класса
  425. таблицы:
  426. </para>
  427. <example id="zend.db.table.row.extending.overriding-example1">
  428. <title>Пример собственной логики в классе строки</title>
  429. <para>
  430. Собственная логика может применяться не во всех случаях
  431. операций над определенной таблицей. Вы можете реализовать
  432. свою логику в классе строки и создавать экземпляр класса
  433. таблицы с указанием этого класса строки в качестве
  434. используемого. Иначе в таблице используется класс
  435. строки по умолчанию.
  436. </para>
  437. <para>
  438. Вам нужно, чтобы операции над данными в этой таблице
  439. журналировались через объект Zend_Log, но только если в
  440. конфигурации приложения включено это поведение.
  441. </para>
  442. <programlisting language="php"><![CDATA[
  443. class MyLoggingRow extends Zend_Db_Table_Row_Abstract
  444. {
  445. protected function _insert()
  446. {
  447. $log = Zend_Registry::get('database_log');
  448. $log->info(Zend_Debug::dump($this->_data,
  449. "INSERT: $this->_tableClass",
  450. false)
  451. );
  452. }
  453. }
  454. // $loggingEnabled - свойство, используемое для примера и зависящее
  455. // от конфигурации вашего приложения
  456. if ($loggingEnabled) {
  457. $bugs = new Bugs(array('rowClass' => 'MyLoggingRow'));
  458. } else {
  459. $bugs = new Bugs();
  460. }
  461. ]]>
  462. </programlisting>
  463. </example>
  464. <example id="zend.db.table.row.extending.overriding-example2">
  465. <title>Пример класса строки, журналирующего добавляемые данные для нескольких таблиц</title>
  466. <para>
  467. Собственная логика может быть общей для нескольких таблиц.
  468. Вместо реализации одной и той же логики в каждом классе
  469. таблицы вы можете реализовать код этих действий в
  470. классе строки и использовать этот класс строки во
  471. всех ваших классах таблиц.
  472. </para>
  473. <para>
  474. В этом примере журналирующий код одинаков для всех классов
  475. таблиц.
  476. </para>
  477. <programlisting language="php"><![CDATA[
  478. class MyLoggingRow extends Zend_Db_Table_Row_Abstract
  479. {
  480. protected function _insert()
  481. {
  482. $log = Zend_Registry::get('database_log');
  483. $log->info(Zend_Debug::dump($this->_data,
  484. "INSERT: $this->_tableClass",
  485. false)
  486. );
  487. }
  488. }
  489. class Bugs extends Zend_Db_Table_Abstract
  490. {
  491. protected $_name = 'bugs';
  492. protected $_rowClass = 'MyLoggingRow';
  493. }
  494. class Products extends Zend_Db_Table_Abstract
  495. {
  496. protected $_name = 'products';
  497. protected $_rowClass = 'MyLoggingRow';
  498. }
  499. ]]>
  500. </programlisting>
  501. </example>
  502. </sect3>
  503. <sect3 id="zend.db.table.row.extending.inflection">
  504. <title>Определение инфлекции в Zend_Db_Table_Row</title>
  505. <para>
  506. Некоторые разработчики предпочитают, чтобы имя класса таблицы
  507. соответствовало имени таблицы в СУРБД с применением
  508. преобразования, называемого <emphasis>инфлекцией</emphasis>.
  509. </para>
  510. <para>
  511. Классы Zend_Db по умолчанию не производят
  512. инфлекцию. Читайте
  513. <xref linkend="zend.db.table.extending.inflection" /> для
  514. получения информации о причинах такого решения.
  515. </para>
  516. <para>
  517. Если вы предпочитаете использовать инфлекцию, то должны сами
  518. реализовать преобразование, переопределив метод
  519. <code>_transformColumn()</code> в своем классе строки и
  520. использовать этот класс при произведении запросов через ваш
  521. класс таблицы.
  522. </para>
  523. <example id="zend.db.table.row.extending.inflection.example">
  524. <title>Пример определения инфлекционного преобразования</title>
  525. <para>
  526. Это позволяет использовать в аксессорах преобразованный
  527. вариант имени столбца. Класс строки использует метод
  528. <code>_transformColumn()</code> для преобразования имени,
  529. которое используется в качестве "родного" имени столбца в
  530. таблице БД.
  531. </para>
  532. <programlisting language="php"><![CDATA[
  533. class MyInflectedRow extends Zend_Db_Table_Row_Abstract
  534. {
  535. protected function _transformColumn($key)
  536. {
  537. $nativeKey = myCustomInflector($key);
  538. return $nativeKey;
  539. }
  540. }
  541. class Bugs extends Zend_Db_Table_Abstract
  542. {
  543. protected $_name = 'bugs';
  544. protected $_rowClass = 'MyInflectedRow';
  545. }
  546. $bugs = new Bugs();
  547. $row = $bugs->createRow();
  548. // Используются имена столбцов в формате CamelCase, преобразующая функция
  549. // изменяет их представление на "родное"
  550. $row->bugDescription = 'New description';
  551. ]]>
  552. </programlisting>
  553. </example>
  554. <para>
  555. Реализация функций для произведения инфлекционного
  556. преобразования возлагается на разработчика. Zend Framework не
  557. предоставляет для этих целей готовых функций.
  558. </para>
  559. </sect3>
  560. </sect2>
  561. </sect1>
  562. <!--
  563. vim:se ts=4 sw=4 et:
  564. -->