coding_standard.xml 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847
  1. <appendix id="coding-standard">
  2. <title>Стандарт кодирования на PHP в Zend Framework'е</title>
  3. <sect1 id="coding-standard.overview">
  4. <title>Обзор</title>
  5. <sect2 id="coding-standard.overview.scope">
  6. <title>Область применения</title>
  7. <para>
  8. Этот документ предоставляет указания и ресурсы для разрабочиков
  9. и команд работающих на Zend Framework’ом. Освещаемые здесь темы:
  10. <itemizedlist>
  11. <listitem>
  12. <para>Форматирование PHP-файлов</para>
  13. </listitem>
  14. <listitem>
  15. <para>Соглашения по именованию</para>
  16. </listitem>
  17. <listitem>
  18. <para>Стиль кодирования</para>
  19. </listitem>
  20. <listitem>
  21. <para>Встроенная документация</para>
  22. </listitem>
  23. </itemizedlist>
  24. </para>
  25. </sect2>
  26. <sect2 id="coding-standard.overview.goals">
  27. <title>Цели</title>
  28. <para>
  29. Хороший стандарт кодирования важен в любом проекте, и особенно там,
  30. где множество разработчиков работают над одним проектом. Наличие
  31. стандарта кодирования помогает гарантировать, что код высокого
  32. качества, с меньшим количеством ошибок, и легко поддерживается.
  33. </para>
  34. </sect2>
  35. </sect1>
  36. <sect1 id="coding-standard.php-file-formatting">
  37. <title>Форматирование PHP-файлов</title>
  38. <sect2 id="coding-standard.php-file-formatting.general">
  39. <title>Общее</title>
  40. <para>
  41. Для файлов, содержащих только PHP-код, закрывающийся тег ("?>")
  42. не разрешен. Он не требуется синтаксисом PHP. Это предотвращает
  43. от случайного включения в вывод конечных пробелов.
  44. </para>
  45. <para>
  46. <emphasis>ВАЖНО:</emphasis> Включение бинарных файлов как разрешает <code>__HALT_COMPILER()</code>
  47. запрещено из любого PHP-файла Zend framework'а или файлов
  48. производных от него. Эта возможность разрешена для использования
  49. только в специальных инсталляционных скриптах.
  50. </para>
  51. </sect2>
  52. <sect2 id="coding-standard.php-file-formatting.indentation">
  53. <title>Отступы</title>
  54. <para>Для отступа используйте 4 пробела. Не используйте символ табуляции.</para>
  55. </sect2>
  56. <sect2 id="coding-standard.php-file-formatting.max-line-length">
  57. <title>Максимальная длина строки</title>
  58. <para>
  59. Рекомендуемая длина строки составляет 80 символов, т.е.
  60. разработчики должны стремиться держать код как можно ближе к
  61. 80-символьной границе, когда это возможно. Однако более длинные
  62. строки также допустимы. Максимальная длина любой строки PHP-кода
  63. не должна превышать 120 символов.
  64. </para>
  65. </sect2>
  66. <sect2 id="coding-standard.php-file-formatting.line-termination">
  67. <title>Переводы строк</title>
  68. <para>
  69. Переводы строк должны быть как принято для текстовых файлов в
  70. Unix-системах. Строки должны заканчиваться только символом
  71. перевода на новую строку (LF). Символ перевода на новую строку
  72. в десятичном виде представляется как число 10, или как 0x0A в
  73. шестнадцатеричном.
  74. </para>
  75. <para>
  76. Не используйте комбинацию символов возврата каретки/перевода
  77. строки (CRLF) как на Windows-компьютерах (0x0D, 0x0A).
  78. </para>
  79. </sect2>
  80. </sect1>
  81. <sect1 id="coding-standard.naming-conventions">
  82. <title>Соглашения по именованию</title>
  83. <sect2 id="coding-standard.naming-conventions.classes">
  84. <title>Классы</title>
  85. <para>
  86. Zend Framework использует схему именования классов, в
  87. соответсвтвии с которой имена классов напрямую указывают на
  88. директории, где они находятся. Корневой директорией Zend
  89. Framework'а является директория "Zend/", в которой иерархически
  90. расположены все классы.
  91. </para>
  92. <para>
  93. Имена классов могут содержать только буквенно-числовые символы.
  94. Числа допустимы в именах классов, но не приветствуются.
  95. Символы нижнего подчеркивания допустимы в местах разделителей
  96. пути - имя файла "Zend/Db/Table.php" должно указывать на класс
  97. с именем "Zend_Db_Table".
  98. </para>
  99. <para>
  100. Если имя класса состоит из более чем одного слова, то первая
  101. буква каждого слова должна быть заглавной. Последующие
  102. заглавные буквы недопустимы, например, имя класса "Zend_PDF" -
  103. недопустимо, в то время как имя "Zend_Pdf" допустимо.
  104. </para>
  105. <para>
  106. Классы Zend Framework'а написанных Zend'ом или одной из
  107. участвующих компаний-партнеров и распространяемых с фреймворком
  108. должны всегда начинаться с префикса "Zend_" и должны
  109. располагаться в директории "Zend/" в соответствии с иерархией.
  110. </para>
  111. <para>
  112. Ниже примеры допустимых имен классов:
  113. <programlisting role="php"><![CDATA[
  114. Zend_Db
  115. Zend_View
  116. Zend_View_Helper
  117. ]]></programlisting>
  118. <emphasis>ВАЖНО:</emphasis> Код, который оперирует с фреймворком,
  119. но не является его частью, например, код написанный пользователем
  120. фреймворка и это не компания Zend или один из партнеров по
  121. фреймворку, не должен начинаться с префикса "Zend_".
  122. </para>
  123. </sect2>
  124. <sect2 id="coding-standard.naming-conventions.interfaces">
  125. <title>Интерфейсы</title>
  126. <para>
  127. Интерфейсы должны следовать той же схеме именования, как и
  128. классы (смотрите выше), однако должны заканчиваться
  129. словом "Interface", как в следующих примерах:
  130. <programlisting role="php"><![CDATA[
  131. Zend_Log_Adapter_Interface
  132. Zend_Controller_Dispatcher_Interface]]></programlisting>
  133. </para>
  134. </sect2>
  135. <sect2 id="coding-standard.naming-conventions.filenames">
  136. <title>Имена файлов</title>
  137. <para>
  138. Для файлов допустимы буквенно-числовые символы, символы нижнего
  139. подчеркивания и тире ("-"). Пробелы запрещены.
  140. </para>
  141. <para>
  142. Любой файл содержащий PHP-код должен иметь расширение ".php".
  143. Это примеры показывают допустимые имена файлов для классов из
  144. примеров в секции выше:
  145. <programlisting role="php"><![CDATA[
  146. Zend/Db.php
  147. Zend/Controller/Front.php
  148. Zend/View/Helper/FormRadio.php]]></programlisting>
  149. Имена файлов отражаются на имена классов, как описано выше.
  150. </para>
  151. </sect2>
  152. <sect2 id="coding-standard.naming-conventions.functions-and-methods">
  153. <title>Функции и методы</title>
  154. <para>
  155. Имена функций могут содержать буквенно-числовые символы.
  156. Символы нижнего подчеркивания не разрешены. Числа разрешены в
  157. именах функций, но не приветствуются.
  158. </para>
  159. <para>
  160. Имена функций должны всегда начинатся с буквы в нижнем регистре.
  161. Когда имя функции состоит из более чем одного слова, первая
  162. буква каждого нового слова должна быть заглавной. Это обычно
  163. называется "верблюжьей" нотацией.
  164. </para>
  165. <para>
  166. Многословность приветствуется. Имена функций должны быть
  167. настолько говорящими, насколько это практично для повышения
  168. понимаемости кода.
  169. </para>
  170. <para>
  171. Это примеры допустимых имен функций:
  172. <programlisting role="php"><![CDATA[
  173. filterInput()
  174. getElementById()
  175. widgetFactory()]]></programlisting>
  176. </para>
  177. <para>
  178. Для объектно-ориентированного программирования принято, чтобы
  179. методы доступа имели префикс "get" или "set".
  180. Когда используются шаблоны проектирования, такие, как "синглтон"
  181. или "фабрика", имена методов должны содержать имя шаблона, чтобы
  182. можно было быстро узнать шаблон.
  183. </para>
  184. <para>
  185. Функции в глобальной области видимости ("плавающие функции")
  186. допустимы, но не приветствуются. Рекомендуется обрамлять такие
  187. функции в статические классы.
  188. </para>
  189. </sect2>
  190. <sect2 id="coding-standard.naming-conventions.variables">
  191. <title>Переменные</title>
  192. <para>
  193. Имена переменных могут содержать буквенно-числовые символы.
  194. Символы нижнего подчеркивания не разрешены. Числа разрешены в
  195. именах переменных, но не приветствуются.
  196. </para>
  197. <para>
  198. Для переменных - членов классов, определенных с помощью
  199. префиксов области видимости "private" или "protected", первый
  200. символ имени должен быть один символ нижнего подчеркивания. Это
  201. единственное допустимое использование символа нижнего
  202. подчеркивания в имени. Переменные - члены классов определенные
  203. с помощью префикса области видимости "public" никогда не должны
  204. начинаться с символа нижнего подчеркивания.
  205. </para>
  206. <para>
  207. Как и имена функций (смотрите секцию 3.3 выше) имена переменных
  208. должны начинаться с буквы в нижнем регистре и следовать
  209. "верблюжьей" нотации.
  210. </para>
  211. <para>
  212. Многословность приветствуется. Имена переменных должны быть
  213. настолько говорящими, насколько это практично. Краткие имена
  214. переменных, такие как "$i" и "$n" не приветствуются нигде,
  215. кроме как в контексте маленьких циклов. Если цикл содержит
  216. более 20 строк кода, то переменные для индексов должны иметь
  217. более говорящие имена.
  218. </para>
  219. </sect2>
  220. <sect2 id="coding-standard.naming-conventions.constants">
  221. <title>Константы</title>
  222. <para>
  223. Константы могут содержать буквенно-числовые символы и символы
  224. нижнего подчеркивания. Числа разрешены в именах констант.
  225. </para>
  226. <para>
  227. Имена констант должны быть в верхнем регистре.
  228. </para>
  229. <para>
  230. Константы должны быть определены как члены классов с
  231. использованием ключевого слова "const". Определение констант в
  232. глобальной области видимости с помощью "define" допустимо, но
  233. не рекомендуется.
  234. </para>
  235. </sect2>
  236. </sect1>
  237. <sect1 id="coding-standard.coding-style">
  238. <title>Стиль кодирования</title>
  239. <sect2 id="coding-standard.coding-style.php-code-demarcation">
  240. <title>Обрамление PHP-кода</title>
  241. <para>
  242. PHP-код должен всегда обрамлятся полными PHP-тегами:
  243. <programlisting role="php"><![CDATA[
  244. <?php
  245. ?>]]></programlisting>
  246. </para>
  247. <para>
  248. Короткие теги не допустимы.
  249. </para>
  250. </sect2>
  251. <sect2 id="coding-standard.coding-style.strings">
  252. <title>Строки</title>
  253. <sect3 id="coding-standard.coding-style.strings.literals">
  254. <title>Строковые литералы</title>
  255. <para>
  256. Когда строка является литеральной (не содержит подстановок
  257. переменных), для ее обрамления должны использоваться
  258. апострофы или "одинарные кавычки":
  259. <programlisting role="php"><![CDATA[
  260. $a = 'Example String';]]></programlisting>
  261. </para>
  262. </sect3>
  263. <sect3 id="coding-standard.coding-style.strings.literals-containing-apostrophes">
  264. <title>Строковые литералы, содержащие апострофы</title>
  265. <para>
  266. Когда строка литералов сама содержит апострофы, разрешается
  267. для обрамления строки использовать "двойные кавычки". Это
  268. особенно актуально для SQL-запросов:
  269. <programlisting role="php"><![CDATA[
  270. $sql = "SELECT `id`, `name` from `people` WHERE `name`='Fred' OR `name`='Susan'";]]></programlisting>
  271. Синтаксис выше является более предпочтительным, чем
  272. экранирование апострофов.
  273. </para>
  274. </sect3>
  275. <sect3 id="coding-standard.coding-style.strings.variable-substitution">
  276. <title>Подстановка переменных</title>
  277. <para>
  278. Подстановка переменных разрешается с использованием двух
  279. нижеприведенных форм:
  280. <programlisting role="php"><![CDATA[
  281. $greeting = "Hello $name, welcome back!";
  282. $greeting = "Hello {$name}, welcome back!";]]></programlisting>
  283. </para>
  284. <para>
  285. Для надежности, эта форма не допустима:
  286. <programlisting role="php"><![CDATA[
  287. $greeting = "Hello ${name}, welcome back!";]]></programlisting>
  288. </para>
  289. </sect3>
  290. <sect3 id="coding-standard.coding-style.strings.string-concatenation">
  291. <title>Конкатенация строк</title>
  292. <para>
  293. Строки должны объединятся с помощью оператора ".". Пробел
  294. должен всегда добавлятся до и после оператора "." для
  295. улучшения читабельности:
  296. <programlisting role="php"><![CDATA[
  297. $company = 'Zend' . 'Technologies';]]></programlisting>
  298. </para>
  299. <para>
  300. Когда производится конкатенация строк с помощью оператора
  301. ".", разрешается разрывать выражение на несколько строк для
  302. улучшения читабельности. В этом случае, каждая следующая
  303. строка должна быть дополнена пробелами так, чтобы оператор
  304. "." был выровнен под оператором "=":
  305. <programlisting role="php"><![CDATA[
  306. $sql = "SELECT `id`, `name` FROM `people` "
  307. . "WHERE `name` = 'Susan' "
  308. . "ORDER BY `name` ASC ";]]></programlisting>
  309. </para>
  310. </sect3>
  311. </sect2>
  312. <sect2 id="coding-standard.coding-style.arrays">
  313. <title>Массивы</title>
  314. <sect3 id="coding-standard.coding-style.arrays.numerically-indexed">
  315. <title>Массивы с числовыми индексами</title>
  316. <para>Отрицательные числа в качестве индексов запрещены.</para>
  317. <para>
  318. Хотя индекс массива может начинаться с отрицательного числа,
  319. но это не приветствуется и рекомендуется, чтобы все
  320. массивы начинали индексирование с 0.
  321. </para>
  322. <para>
  323. Когда определяется индексированный массив с помощью
  324. конструкции <code>array</code>, завершающий пробел должен
  325. быть добавлен после каждой запятой для улучшения
  326. читабельности:
  327. <programlisting role="php"><![CDATA[
  328. $sampleArray = array(1, 2, 3, 'Zend', 'Studio');]]></programlisting>
  329. </para>
  330. <para>
  331. Также разрешается определять многострочные индексированные
  332. массивы, используя конструкцию "array". В этом случае,
  333. каждая следующая строка должна быть дополнена пробелами
  334. так, чтобы начало каждой строки было выравнено как показано
  335. ниже:
  336. <programlisting role="php"><![CDATA[
  337. $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
  338. $a, $b, $c,
  339. 56.44, $d, 500);]]></programlisting>
  340. </para>
  341. </sect3>
  342. <sect3 id="coding-standard.coding-style.arrays.associative">
  343. <title>Ассоциативные массивы</title>
  344. <para>
  345. Когда определяется ассоциативный массив с помощью
  346. конструкции "array", приветствуется разделение выражения на
  347. несколько строк. В этом случае, каждая следующая строка
  348. должна быть дополнена с помощью пробелов так, чтобы и ключи
  349. и значения были выровнены:
  350. <programlisting role="php"><![CDATA[
  351. $sampleArray = array('firstKey' => 'firstValue',
  352. 'secondKey' => 'secondValue');]]></programlisting>
  353. </para>
  354. </sect3>
  355. </sect2>
  356. <sect2 id="coding-standard.coding-style.classes">
  357. <title>Классы</title>
  358. <sect3 id="coding-standard.coding-style.classes.declaration">
  359. <title>Определение класса</title>
  360. <para>
  361. Классы должны определяться по следующей схеме.
  362. </para><para>
  363. Фигурная скобка всегда пишется на следующей строке под
  364. именем класса.
  365. </para><para>
  366. Каждый класс должен иметь блок документации (doc-блок) в
  367. соответствии со стандартом PHPDocumentor.
  368. </para><para>
  369. Код внутри класса должен иметь отступ в четыре пробела.
  370. </para><para>
  371. Только один класс разрешен внутри одного PHP-файла.
  372. </para><para>
  373. Размещение дополнительно кода в файле с классом разрешено,
  374. но не приветствуется. В таких файлах, две пустые строки
  375. должны разделять класс и дополнительный PHP-код.
  376. </para><para>
  377. Это пример допустимого определения класса:
  378. <programlisting role="php"><![CDATA[
  379. /**
  380. * Doc-блок здесь
  381. */
  382. class SampleClass
  383. {
  384. // содержимое класса должно быть
  385. // с отступом в четыре пробела
  386. }]]></programlisting>
  387. </para>
  388. </sect3>
  389. <sect3 id="coding-standard.coding-style.classes.member-variables">
  390. <title>Переменные-члены классов</title>
  391. <para>
  392. Переменные-члены классов должны определяться по следующей схеме.
  393. </para><para>
  394. Любые переменные, определенные в классе, должны быть
  395. определены в начале класса, до определения любого метода.
  396. </para><para>
  397. Ключевое слово <code>var</code> не разрешено. Члены класса
  398. должны всегда определять их область видимости, используя
  399. ключевое слово <code>private</code>, <code>protected</code>
  400. или <code>public</code>. Доступ к переменным-членам
  401. класса напрямую используя префикс <code>public</code>
  402. разрешено, но не приветствуется в пользу методов
  403. доступа (set/get).
  404. </para>
  405. </sect3>
  406. </sect2>
  407. <sect2 id="coding-standard.coding-style.functions-and-methods">
  408. <title>Функции и методы</title>
  409. <sect3 id="coding-standard.coding-style.functions-and-methods.declaration">
  410. <title>Определение функций и методов</title>
  411. <para>
  412. Функции должны определяться по следующей схеме.
  413. </para><para>
  414. Функции внутри классов должны всегда определять свою область
  415. видимости с помощью одного из префиксов <code>private</code>,
  416. <code>protected</code> или <code>public</code>.
  417. </para><para>
  418. Как и у классов, фигурная скобка всегда пишется на
  419. следующей строке под именем функции. Пробелы между именем
  420. функции и круглой скобкой для аргументов отсутствуют.
  421. </para><para>
  422. Функции в глобальной области видимости крайне не приветствуются.
  423. </para><para>
  424. Это пример допустимого определения функции:
  425. <programlisting role="php"><![CDATA[
  426. /**
  427. * Doc-блок здесь
  428. */
  429. class Foo
  430. {
  431. /**
  432. * Doc-блок здесь
  433. */
  434. public function bar()
  435. {
  436. // содержимое класса должно быть
  437. // с отступом в четыре пробела
  438. }
  439. }]]></programlisting>
  440. </para>
  441. <para>
  442. <emphasis>ЗАМЕЧАНИЕ:</emphasis> Передача по ссылке допустима только в определениях функций:
  443. <programlisting role="php"><![CDATA[
  444. /**
  445. * Doc-блок здесь
  446. */
  447. class Foo
  448. {
  449. /**
  450. * Doc-блок здесь
  451. */
  452. public function bar(&$baz)
  453. {}
  454. }]]></programlisting>
  455. </para>
  456. <para>
  457. Передача по ссылке во время вызова запрещена.
  458. </para>
  459. <para>
  460. Возвращаемое значение не должно обрамляться в круглые
  461. скобки, иначе это ухудшает читабельность, а также может
  462. поломать код, если метод позже станет возвращать
  463. результат по ссылке.
  464. <programlisting role="php"><![CDATA[
  465. /**
  466. * Doc-блок здесь
  467. */
  468. class Foo
  469. {
  470. /**
  471. * ПЛОХО
  472. */
  473. public function bar()
  474. {
  475. return($this->bar);
  476. }
  477. /**
  478. * ХОРОШО
  479. */
  480. public function bar()
  481. {
  482. return $this->bar;
  483. }
  484. }]]></programlisting>
  485. </para>
  486. </sect3>
  487. <sect3 id="coding-standard.coding-style.functions-and-methods.usage">
  488. <title>Использование функций и методов</title>
  489. <para>
  490. Аргументы функции разделяются одним завершающим пробелом
  491. после каждой запятой. Это пример допустимого вызова функции
  492. для функции, которая принимает три аргумента:
  493. <programlisting role="php"><![CDATA[
  494. threeArguments(1, 2, 3);]]></programlisting>
  495. </para>
  496. <para>
  497. Передача по ссылке во время вызова запрещена. Смотрите
  498. секцию определения функций для правильного способа передачи
  499. аргументов функции по ссылке.
  500. </para><para>
  501. Для функций, чьи аргументы допускают массив, вызов функции
  502. может включать конструкцию "array" и может быть разделено
  503. на несколько строк для улучшения читабельности. В этом
  504. случае, применим стандарт описания массивов:
  505. <programlisting role="php"><![CDATA[
  506. threeArguments(array(1, 2, 3), 2, 3);
  507. threeArguments(array(1, 2, 3, 'Zend', 'Studio',
  508. $a, $b, $c,
  509. 56.44, $d, 500), 2, 3);]]></programlisting>
  510. </para>
  511. </sect3>
  512. </sect2>
  513. <sect2 id="coding-standard.coding-style.control-statements">
  514. <title>Управляющие структуры</title>
  515. <sect3 id="coding-standard.coding-style.control-statements.if-else-elseif">
  516. <title>If / Else / Elseif</title>
  517. <para>
  518. Управляющие структуры, основанные на конструкциях
  519. <code>if</code> и <code>elseif</code>, должны иметь один
  520. пробел до открывающей круглой скобки условия, и один
  521. пробел после закрывающей круглой скобки.
  522. </para>
  523. <para>
  524. Внутри выражения условия между круглыми скобками
  525. операторы должны разделяться пробелами для читабельности.
  526. Внутренние скобки приветствуются для улучшения логической
  527. группировки больших условий.
  528. </para>
  529. <para>
  530. Открывающаяся фигурная скобка пишется на той же строке,
  531. что и условие. Закрывающаяся фигурная скобка пишется на
  532. отдельной строке. Все содержимое между скобками пишется с
  533. отступом в четыре пробела.
  534. <programlisting role="php"><![CDATA[
  535. if ($a != 2) {
  536. $a = 2;
  537. }]]></programlisting>
  538. </para>
  539. <para>
  540. Для выражения "if", включая "elseif" или "else",
  541. форматирование должно быть таким, как в следующем примере:
  542. <programlisting role="php"><![CDATA[
  543. if ($a != 2) {
  544. $a = 2;
  545. } else {
  546. $a = 7;
  547. }
  548. if ($a != 2) {
  549. $a = 2;
  550. } elseif ($a == 3) {
  551. $a = 4;
  552. } else {
  553. $a = 7;
  554. }]]></programlisting>
  555. PHP допускает написание таких выражений без фигурных скобок
  556. при некоторых условиях. Стандарт кодирования не делает
  557. различий - для всех "if", "elseif" или "else" выражений
  558. необходимо использовать фигурные скобки.
  559. </para>
  560. <para>
  561. Использование "elseif" конструкции допускается, но крайне
  562. не приветствуется в пользу "else if" комбинации.
  563. </para>
  564. </sect3>
  565. <sect3 id="coding-standards.coding-style.control-statements.switch">
  566. <title>Switch</title>
  567. <para>
  568. Управляющие структуры написанные с использованием "switch"
  569. конструкции должны иметь один пробел до открывающей
  570. круглой скобки условного выражения, и также один пробел
  571. после закрывающей круглой скобки.
  572. </para>
  573. <para>
  574. Все содержимое между фигурными скобками пишется с отступом
  575. в четыре пробела. Содержимое каждого "case" выражения
  576. должно писаться с отступом в дополнительные четыре пробела.
  577. </para>
  578. <programlisting role="php"><![CDATA[
  579. switch ($numPeople) {
  580. case 1:
  581. break;
  582. case 2:
  583. break;
  584. default:
  585. break;
  586. }]]></programlisting>
  587. <para>
  588. Ключевое слово <code>default</code> никогда не должно
  589. опускаться в выражении <code>switch</code>.
  590. </para>
  591. <para>
  592. <emphasis>ЗАМЕЧАНИЕ:</emphasis> Иногда полезно писать
  593. <code>case</code> выражения, которые передают управление
  594. следующему <code>case</code> выражению, опуская
  595. <code>break</code> или <code>return</code>. Для того, чтобы
  596. отличать такие случаи от ошибок, каждое <code>case</code>
  597. выражение, где опущен <code>break</code> или
  598. <code>return</code>, должно содержать комментарий
  599. "// break intentionally omitted".
  600. </para>
  601. </sect3>
  602. </sect2>
  603. <sect2 id="coding-standards.inline-documentation">
  604. <title>Встроенная документация</title>
  605. <sect3 id="coding-standards.inline-documentation.documentation-format">
  606. <title>Формат документации</title>
  607. <para>
  608. Все блоки документации ("doc-блоки") должны быть
  609. совместимы с форматом phpDocumentor. Описание формата
  610. phpDocumentor вне рамок данного докумета. Для дополнительно
  611. информации смотрите: <ulink url="http://phpdoc.org/">http://phpdoc.org/</ulink>
  612. </para>
  613. <para>
  614. Все файлы с исходными кодами, написанные для Zend
  615. Framework'а, или которые оперируют с фреймворком, должны
  616. содержать "файловые" doc-блоки в начале каждого файла и
  617. "классовый" doc-блок непосредственно перед каждым классом.
  618. Ниже даны примеры таких doc-блоков.
  619. </para>
  620. </sect3>
  621. <sect3 id="coding-standards.inline-documentation.files">
  622. <title>Файлы</title>
  623. <para>
  624. Каждый файл, содержащий PHP-код должен иметь заголовочный
  625. блок в начале файла, содержащий как минимум следующие
  626. phpDocumentor-теги:
  627. <programlisting role="php"><![CDATA[
  628. /**
  629. * Краткое описание файла
  630. *
  631. * Длинное описание файла (если есть)...
  632. *
  633. * LICENSE: Some license information
  634. *
  635. * @copyright 2005 Zend Technologies
  636. * @license http://www.zend.com/license/3_0.txt PHP License 3.0
  637. * @version $Id:$
  638. * @link http://dev.zend.com/package/PackageName
  639. * @since File available since Release 1.2.0
  640. */]]></programlisting>
  641. </para>
  642. </sect3>
  643. <sect3 id="coding-standards.inline-documentation.classes">
  644. <title>Классы</title>
  645. <para>
  646. Каждый класс должен иметь doc-блок, содержащий как
  647. минимум следующие phpDocumentor-теги:
  648. <programlisting role="php"><![CDATA[
  649. /**
  650. * Краткое описание класса
  651. *
  652. * Длинное описание класса (если есть)...
  653. *
  654. * @copyright 2005 Zend Technologies
  655. * @license http://www.zend.com/license/3_0.txt PHP License 3.0
  656. * @version Release: @package_version@
  657. * @link http://dev.zend.com/package/PackageName
  658. * @since Class available since Release 1.2.0
  659. * @deprecated Class deprecated in Release 2.0.0
  660. */]]></programlisting>
  661. </para>
  662. </sect3>
  663. <sect3 id="coding-standards.inline-documentation.functions">
  664. <title>Функции</title>
  665. <para>
  666. Каждая функция, включая методы объектов, должна иметь
  667. doc-блок, содержащий как минимум:
  668. <itemizedlist>
  669. <listitem><para>Описание функции</para></listitem>
  670. <listitem><para>Все аргументы</para></listitem>
  671. <listitem><para>Все возможные возвращаемые значения</para></listitem>
  672. </itemizedlist>
  673. </para>
  674. <para>
  675. Нет надобности использовать тег "@access", потому что
  676. область видимости уже известна из ключевых слов "public",
  677. "private" или "protected". используемых при определении
  678. функции.
  679. </para>
  680. <para>
  681. Если функция/метод может выбрасывать исключение,
  682. используйте тег @throws:
  683. <programlisting role="php"><![CDATA[
  684. @throws exceptionclass [описание]
  685. ]]></programlisting>
  686. </para>
  687. </sect3>
  688. </sect2>
  689. </sect1>
  690. </appendix>
  691. <!--
  692. vim:se ts=4 sw=4 et:
  693. -->