coding_standard.xml 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <appendix id="coding-standard">
  5. <title>Zend Framework PHP 標準コーディング規約</title>
  6. <sect1 id="coding-standard.overview">
  7. <title>概要</title>
  8. <sect2 id="coding-standard.overview.scope">
  9. <title>対象範囲</title>
  10. <para>
  11. このドキュメントは、Zend Framework に貢献してくださる開発者個人 (あるいはチーム)
  12. のためにコードの書式やドキュメント作成の指針を示すものです。
  13. Zend Framework を用いて開発をする人たちにとってもこのコーディング規約は有用でしょう。
  14. これに従えば、Zend Framework のコードとの一貫性が保てるからです。
  15. そのためには、ここで完全なコーディング規約を示す必要があります。
  16. </para>
  17. <note>
  18. <para>
  19. 詳細なレベルまでの設計指針を示すこと以上に、
  20. それを標準規格として確立することが大切だと考えています。
  21. Zend Framework コーディング規約の指針は、
  22. これまで Zend Framework プロジェクトでうまく回っていた方針をまとめたものです。
  23. この<ulink url="http://framework.zend.com/license">ライセンス</ulink>のもとで、
  24. そのまま使用するなり多少変更して使用するなりすることができます。
  25. </para>
  26. </note>
  27. <para>
  28. Zend Framework コーディング規約では、次のような内容を扱います。
  29. </para>
  30. <itemizedlist>
  31. <listitem>
  32. <para><acronym>PHP</acronym> ファイルの書式</para>
  33. </listitem>
  34. <listitem>
  35. <para>命名規約</para>
  36. </listitem>
  37. <listitem>
  38. <para>コーディングスタイル</para>
  39. </listitem>
  40. <listitem>
  41. <para>インラインドキュメント</para>
  42. </listitem>
  43. </itemizedlist>
  44. </sect2>
  45. <sect2 id="coding-standard.overview.goals">
  46. <title>目標</title>
  47. <para>
  48. どのような開発プロジェクトであっても、コーディング規約は重要です。
  49. 特に、複数の開発者が参加するプロジェクトならなおさらです。コーディング規約に従うことで、
  50. コードの品質保持・バグの減少・保守の容易性の確保
  51. などの助けになります。
  52. </para>
  53. </sect2>
  54. </sect1>
  55. <sect1 id="coding-standard.php-file-formatting">
  56. <title>PHP ファイルの書式</title>
  57. <sect2 id="coding-standard.php-file-formatting.general">
  58. <title>全般</title>
  59. <para>
  60. <acronym>PHP</acronym> コードのみからなるファイルでは、終了タグ ("?>")
  61. は決して含めてはいけません。これは必須なものではなく、
  62. 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。
  63. </para>
  64. <note>
  65. <para>
  66. <emphasis>重要:</emphasis> Zend Framework の <acronym>PHP</acronym>
  67. ファイルやそこから派生したものの中では、
  68. <methodname>__HALT_COMPILER()</methodname>
  69. を使用して任意のバイナリデータを含めることを禁じます。
  70. この機能は、インストールスクリプトなどの特別な場合にのみ使用します。
  71. </para>
  72. </note>
  73. </sect2>
  74. <sect2 id="coding-standard.php-file-formatting.indentation">
  75. <title>字下げ</title>
  76. <para>字下げは空白 4 文字で行います。タブ文字を使ってはいけません。</para>
  77. </sect2>
  78. <sect2 id="coding-standard.php-file-formatting.max-line-length">
  79. <title>1 行の長さ</title>
  80. <para>
  81. 1 行の長さを 80 文字までにすることを目指しましょう。すなわち、
  82. コードの長さを現実的な範囲で 80 文字までにおさめるよう努力すべきです。
  83. しかしながら、場合によっては少々長くなってしまってもかまいません。
  84. <acronym>PHP</acronym> コードの行の長さは、最大 120 文字までにするようにしましょう。
  85. </para>
  86. </sect2>
  87. <sect2 id="coding-standard.php-file-formatting.line-termination">
  88. <title>行末</title>
  89. <para>
  90. 行末の扱いは、標準的な Unix テキストファイルの方式にあわせます。
  91. 行末は、ラインフィード (LF) のみにしなければなりません。
  92. この文字のコードは 10、あるいは 16 進形式で 0x0A となります。
  93. </para>
  94. <para>
  95. Apple OS のようなキャリッジリターン (CR) (0x0D) や
  96. Windows OS のようなキャリッジリターンとラインフィードの組み合わせ (<acronym>CRLF</acronym>)
  97. (0x0D, 0x0A) を使用しないでください。
  98. </para>
  99. </sect2>
  100. </sect1>
  101. <sect1 id="coding-standard.naming-conventions">
  102. <title>命名規約</title>
  103. <sect2 id="coding-standard.naming-conventions.classes">
  104. <title>クラス</title>
  105. <para>
  106. Zend Framework では、クラスの名前が保存先ディレクトリに直接対応するような
  107. 命名規約を採用しています。Zend Framework 標準ライブラリの最上位レベルのディレクトリは
  108. "Zend/" ディレクトリです。一方、Zend Framework 追加ライブラリの最上位レベルのディレクトリは
  109. "ZendX/" ディレクトリです。この配下に、すべてのクラスが階層構造で保存されます。
  110. </para>
  111. <para>
  112. クラス名には英数字のみが使用できます。クラス名に数字を使用することは可能ですが、
  113. ほとんどの場合はお勧めしません。アンダースコアはパス区切り文字としてのみ使用可能です。
  114. ファイル名が "<filename>Zend/Db/Table.php</filename>" の場合、クラス名を
  115. "<classname>Zend_Db_Table</classname>" としなければなりません。
  116. </para>
  117. <para>
  118. クラス名が複数の単語から成り立つ場合は、
  119. それぞれの単語の最初の文字を大文字にしなければなりません。
  120. 大文字を連続して使用することはできません。例えば
  121. "Zend_PDF" というクラス名は許可されません。代わりに
  122. "<classname>Zend_Pdf</classname>" を使用します。
  123. </para>
  124. <para>
  125. これらの規約によって、Zend Framework 上で擬似名前空間を定義しています。
  126. <acronym>PHP</acronym> に名前空間機能が追加されるようになったら、Zend Framework もそれに対応させます。
  127. それにより、開発者は自分のアプリケーションで名前空間を使用できるようになります。
  128. </para>
  129. <para>
  130. 標準ライブラリや追加ライブラリのクラス名を見れば、クラス名の命名規約のよい例となるでしょう。
  131. </para>
  132. <note>
  133. <para>
  134. <emphasis>重要:</emphasis> Zend Framework ライブラリとともに配布するが、
  135. 標準ライブラリや拡張ライブラリではないもの
  136. (たとえば、アプリケーションのコードや Zend 以外が作成したライブラリなど)
  137. については、"Zend_" や "ZendX_" で始まる名前は使用できません。
  138. </para>
  139. </note>
  140. </sect2>
  141. <sect2 id="coding-standard.naming-conventions.abstracts">
  142. <title>抽象クラス</title>
  143. <para>
  144. 一般に、抽象クラスの規約は通常の <link
  145. linkend="coding-standard.naming-conventions.classes">クラス</link>
  146. と同じものとなります。追加の規則として、抽象クラスの名前は最後が "Abstract"
  147. (そしてその前にはアンダースコアはつけない) でなければなりません。
  148. たとえば <classname>Zend_Controller_Plugin_Abstract</classname>
  149. は規約にそった名前ではありません。規約に従った名前は
  150. <classname>Zend_Controller_PluginAbstract</classname> あるいは
  151. <classname>Zend_Controller_Plugin_PluginAbstract</classname> となります。
  152. </para>
  153. <note>
  154. <para>
  155. この命名規約が適用されるのは、Zend Framework 1.9.0 以降です。
  156. それより前のバージョンではこの規約に従っていないものもあるかもしれませんが、
  157. 将来のバージョンでは規約に従うよう名前が変わる予定です。
  158. </para>
  159. <!-- TODO : to be translated -->
  160. <para>
  161. The rationale for the change is due to namespace usage. As we look towards Zend
  162. Framework 2.0 and usage of <acronym>PHP</acronym> 5.3, we will be using
  163. namespaces. The easiest way to automate conversion to namespaces is to simply
  164. convert underscores to the namespace separator -- but under the old naming
  165. conventions, this leaves the classname as simply "Abstract" or "Interface" --
  166. both of which are reserved keywords in <acronym>PHP</acronym>. If we prepend the
  167. (sub)component name to the classname, we can avoid these issues.
  168. </para>
  169. <para>
  170. To illustrate the situation, consider converting the class
  171. <classname>Zend_Controller_Request_Abstract</classname> to use namespaces:
  172. </para>
  173. <programlisting language="php"><![CDATA[
  174. namespace Zend\Controller\Request;
  175. abstract class Abstract
  176. {
  177. // ...
  178. }
  179. ]]></programlisting>
  180. <para>
  181. Clearly, this will not work. Under the new naming conventions, however, this
  182. would become:
  183. </para>
  184. <programlisting language="php"><![CDATA[
  185. namespace Zend\Controller\Request;
  186. abstract class RequestAbstract
  187. {
  188. // ...
  189. }
  190. ]]></programlisting>
  191. <para>
  192. We still retain the semantics and namespace separation, while omitting the
  193. keyword issues; simultaneously, it better describes the abstract class.
  194. </para>
  195. </note>
  196. </sect2>
  197. <sect2 id="coding-standard.naming-conventions.interfaces">
  198. <title>インターフェイス</title>
  199. <para>
  200. 一般に、インターフェイスの規約は通常の <link
  201. linkend="coding-standard.naming-conventions.classes">クラス</link>
  202. と同じものとなります。追加の規則として、インターフェイスの名前の最後は
  203. "Interface" (そしてその前にはアンダースコアはつけない) にすることもできます。
  204. たとえば <classname>Zend_Controller_Plugin_Interface</classname>
  205. は規約にそった名前ではありません。規約に従った名前は
  206. <classname>Zend_Controller_PluginInterface</classname> あるいは
  207. <classname>Zend_Controller_Plugin_PluginInterface</classname> となります。
  208. </para>
  209. <para>
  210. この規約は必須ではありませんが、強く推奨します。
  211. そのファイルがクラスではなくインターフェイスを含むものであることが
  212. 開発者にわかりやすくなるからです。
  213. </para>
  214. <note>
  215. <para>
  216. この命名規約が適用されるのは、Zend Framework 1.9.0 以降です。
  217. それより前のバージョンではこの規約に従っていないものもあるかもしれませんが、
  218. 将来のバージョンでは規約に従うよう名前が変わる予定です。
  219. この変更に関連する詳細については<link
  220. linkend="coding-standard.naming-conventions.abstracts">前節</link>
  221. をご覧ください。
  222. </para>
  223. </note>
  224. </sect2>
  225. <sect2 id="coding-standard.naming-conventions.filenames">
  226. <title>ファイル名</title>
  227. <para>
  228. すべてのファイルにおいて、使用可能な文字は英数字・アンダースコア
  229. およびダッシュ文字 ("-") のみです。空白文字は使用できません。
  230. </para>
  231. <para>
  232. <acronym>PHP</acronym> コードを含むすべてのファイルの拡張子は
  233. "<filename>.php</filename>" でなければなりません。
  234. ただしビュースクリプトは例外です。次の例は、Zend Framework
  235. のクラスに使用できるファイル名を示すものです。
  236. </para>
  237. <programlisting language="php"><![CDATA[
  238. Zend/Db.php
  239. Zend/Controller/Front.php
  240. Zend/View/Helper/FormRadio.php
  241. ]]></programlisting>
  242. <para>
  243. ファイル名は、上で説明したとおりの方式でクラス名と対応していなければなりません。
  244. </para>
  245. </sect2>
  246. <sect2 id="coding-standard.naming-conventions.functions-and-methods">
  247. <title>関数およびメソッド</title>
  248. <para>
  249. 関数名に含めることができるのは英数字のみです。
  250. アンダースコアを使用してはいけません。
  251. 数字を含めることは可能ですが、ほとんどの場合はお勧めしません。
  252. </para>
  253. <para>
  254. 関数名は小文字で始めなければなりません。
  255. 関数名が複数の単語で構成されている場合は、
  256. 各単語の最初の文字を大文字にしなければなりません。
  257. 一般に、このフォーマットは "camelCaps"
  258. と呼ばれています。
  259. </para>
  260. <para>
  261. 関数名は省略しすぎないようにしましょう。
  262. コードを理解しやすくするため、
  263. 現実的な範囲でできるだけ詳細な名前をつけるようにしましょう。
  264. </para>
  265. <para>
  266. 条件を満たす関数名の例を示します。
  267. </para>
  268. <programlisting language="php"><![CDATA[
  269. filterInput()
  270. getElementById()
  271. widgetFactory()
  272. ]]></programlisting>
  273. <para>
  274. オブジェクト指向のプログラミングでは、
  275. インスタンス変数や静的変数にアクセスするためのメソッドは "get" あるいは "set"
  276. のいずれかで始めなければなりません。singleton や factory
  277. などのデザインパターンを使用する場合は、
  278. メソッド名にパターンの名前を含めるようにしましょう。こうすることで、
  279. どのパターンを使っているのかがわかりやすくなります。
  280. </para>
  281. <para>
  282. オブジェクト内で "private" あるいは "protected"
  283. と宣言されているメソッドについては、メソッド名の最初にアンダースコア
  284. 1 文字をつけなければなりません。アンダースコアを使用できるのは、
  285. この場合のみです。"public" と宣言されているメソッドについては、
  286. 決してアンダースコアで始めてはいけません。
  287. </para>
  288. <para>
  289. グローバル関数は、できる限り使用しないようにしましょう。
  290. このような関数は、静的クラスにまとめることを推奨します。
  291. </para>
  292. </sect2>
  293. <sect2 id="coding-standard.naming-conventions.variables">
  294. <title>変数</title>
  295. <para>
  296. 変数名に含めることができるのは英数字のみです。
  297. アンダースコアを使用してはいけません。
  298. 数字を含めることは可能ですが、ほとんどの場合はお勧めしません。
  299. </para>
  300. <para>
  301. クラス内で "private" あるいは "protected"
  302. と宣言されている変数については、変数名の最初にアンダースコア
  303. 1 文字をつけなければなりません。アンダースコアを使用できるのは、
  304. この場合のみです。"public" と宣言されている変数については、
  305. 決してアンダースコアで始めてはいけません。
  306. </para>
  307. <para>
  308. 関数名と同様 (上の 3.3 を参照ください)、
  309. 変数名も常に小文字で開始する "camelCaps" 方式を使用しなければなりません。
  310. </para>
  311. <para>
  312. 変数名は省略しすぎないようにしましょう。現実的な範囲で、
  313. できるだけ詳細な名前をつけるべきです。"<varname>$i</varname>" や "<varname>$n</varname>"
  314. のような省略形が許されるのは、小さなループ内で使用する場合のみです。
  315. ループが 20 行以上のコードになるようなら、
  316. そのループ変数にはそれなりの名前をつけるべきです。
  317. </para>
  318. </sect2>
  319. <sect2 id="coding-standard.naming-conventions.constants">
  320. <title>定数</title>
  321. <para>
  322. 定数名には英数字およびアンダースコアを使用できます。
  323. 定数名には数字を使用してもかまいません。
  324. </para>
  325. <para>
  326. 定数名は、常にすべて大文字にします。
  327. </para>
  328. <para>
  329. 定数名の単語の間はアンダースコアで区切らなければなりません。
  330. 例えば <constant>EMBED_SUPPRESS_EMBED_EXCEPTION</constant> は許されますが、
  331. <constant>EMBED_SUPPRESSEMBEDEXCEPTION</constant> は許されません。
  332. </para>
  333. <para>
  334. 定数を宣言する際には、クラスのメンバとして "const"
  335. で定義しなければなりません。"define"
  336. によるグローバル定数の宣言も可能ですが、お勧めしません。
  337. </para>
  338. </sect2>
  339. </sect1>
  340. <sect1 id="coding-standard.coding-style">
  341. <title>コーディングスタイル</title>
  342. <sect2 id="coding-standard.coding-style.php-code-demarcation">
  343. <title>PHP コードの境界</title>
  344. <para>
  345. <acronym>PHP</acronym> のコードの区切りには、
  346. 標準 <acronym>PHP</acronym> タグを常に使用しなければなりません。
  347. </para>
  348. <programlisting language="php"><![CDATA[
  349. <?php
  350. ?>
  351. ]]></programlisting>
  352. <para>
  353. 短いタグは決して使用してはいけません。
  354. <acronym>PHP</acronym> コードのみからなるファイルでは、終了タグ ("?>")
  355. は決して含めてはいけません
  356. (<link linkend="coding-standard.php-file-formatting.general">全般</link> を参照ください)。
  357. </para>
  358. </sect2>
  359. <sect2 id="coding-standard.coding-style.strings">
  360. <title>文字列</title>
  361. <sect3 id="coding-standard.coding-style.strings.literals">
  362. <title>文字列リテラル</title>
  363. <para>
  364. 文字列がリテラルである (変数の展開などが含まれない)
  365. 場合は、アポストロフィあるいは「シングルクォート」
  366. で文字列を囲まなければなりません。
  367. </para>
  368. <programlisting language="php"><![CDATA[
  369. $a = '文字列の例';
  370. ]]></programlisting>
  371. </sect3>
  372. <sect3 id="coding-standard.coding-style.strings.literals-containing-apostrophes">
  373. <title>アポストロフィを含む文字列リテラル</title>
  374. <para>
  375. リテラル文字列自体にアポストロフィが含まれている場合は、
  376. 引用符あるいは「ダブルクォート」で文字列を囲んでもかまいません。
  377. 特に <acronym>SQL</acronym> 文などでこのような場合がよくあるでしょう。
  378. </para>
  379. <programlisting language="php"><![CDATA[
  380. $sql = "SELECT `id`, `name` from `people` "
  381. . "WHERE `name`='Fred' OR `name`='Susan'";
  382. ]]></programlisting>
  383. <para>
  384. アポストロフィをエスケープするよりも、上の構文のほうが読みやすくなるのでお勧めです。
  385. </para>
  386. </sect3>
  387. <sect3 id="coding-standard.coding-style.strings.variable-substitution">
  388. <title>変数の展開</title>
  389. <para>
  390. 変数の展開を行うには、次のような方法を使用します。
  391. </para>
  392. <programlisting language="php"><![CDATA[
  393. $greeting = "こんにちは $name さん。ようこそ!";
  394. $greeting = "こんにちは {$name} さん。ようこそ!";
  395. ]]></programlisting>
  396. <para>
  397. 一貫性を保つため、以下の形式は許可されません。
  398. </para>
  399. <programlisting language="php"><![CDATA[
  400. $greeting = "こんにちは ${name} さん。ようこそ!";
  401. ]]></programlisting>
  402. </sect3>
  403. <sect3 id="coding-standard.coding-style.strings.string-concatenation">
  404. <title>文字列の連結</title>
  405. <para>
  406. 文字列の連結には "." 演算子を使用しなければなりません。コードを読みやすくするため、
  407. "." 演算子の前後には常にスペースを入れなければなりません。
  408. </para>
  409. <programlisting language="php"><![CDATA[
  410. $company = 'Zend' . ' ' . 'Technologies';
  411. ]]></programlisting>
  412. <para>
  413. 文字列を "." 演算子で連結する際には、コードを読みやすくするために
  414. ひとつの文を複数行に分けることもできます。そのような場合は、
  415. 2 行目以降の行頭にスペースを入れ、各行の "." 演算子が最初の行の
  416. "=" 演算子と同じ位置にくるようにしなければなりません。
  417. </para>
  418. <programlisting language="php"><![CDATA[
  419. $sql = "SELECT `id`, `name` FROM `people` "
  420. . "WHERE `name` = 'Susan' "
  421. . "ORDER BY `name` ASC ";
  422. ]]></programlisting>
  423. </sect3>
  424. </sect2>
  425. <sect2 id="coding-standard.coding-style.arrays">
  426. <title>配列</title>
  427. <sect3 id="coding-standard.coding-style.arrays.numerically-indexed">
  428. <title>数値添字の配列</title>
  429. <para>添字として負の数を使用してはいけません。</para>
  430. <para>
  431. 数値添字の配列の添字は、0 以上の任意の数から始めることができます。
  432. しかし、常に 0 から始めるようにすることを推奨します。
  433. </para>
  434. <para>
  435. <type>Array</type> を使用して数値添字の配列を宣言する場合は、
  436. コードを読みやすくするため、
  437. 要素を区切るカンマの後にスペースを入れなければなりません。
  438. </para>
  439. <programlisting language="php"><![CDATA[
  440. $sampleArray = array(1, 2, 3, 'Zend', 'Studio');
  441. ]]></programlisting>
  442. <para>
  443. "array" を使用して、複数行にまたがる配列を宣言することも可能です。
  444. その場合は、2 行目以降の行頭にスペースを入れ、
  445. 各行の開始位置が以下のようになるようにしなければなりません。
  446. </para>
  447. <programlisting language="php"><![CDATA[
  448. $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
  449. $a, $b, $c,
  450. 56.44, $d, 500);
  451. ]]></programlisting>
  452. <para>
  453. 一方、配列の最初の要素を次の行から始めることもできます。
  454. その場合は、配列を宣言した位置からさらに一段インデントした位置で要素をそろえ、
  455. それ以降のすべての要素を同じインデントで記述するようにします。
  456. 閉じ括弧はそれ単体でひとつの行に記述し、インデント量は配列の宣言と同じ位置になります。
  457. </para>
  458. <programlisting language="php"><![CDATA[
  459. $sampleArray = array(
  460. 1, 2, 3, 'Zend', 'Studio',
  461. $a, $b, $c,
  462. 56.44, $d, 500,
  463. );
  464. ]]></programlisting>
  465. <para>
  466. この宣言を使用する際は、配列の最後の要素の後にもカンマをつけておくようにしましょう。
  467. そうすることで、配列に新たな要素を追加したときにパースエラーが発生する危険性を
  468. 少なくできます。
  469. </para>
  470. </sect3>
  471. <sect3 id="coding-standard.coding-style.arrays.associative">
  472. <title>連想配列</title>
  473. <para>
  474. 連想配列を <type>Array</type> で宣言する場合には、
  475. 適宜改行をいれて複数行で宣言するようにしましょう。その場合は、
  476. 2 行目以降の行頭などにスペースを入れ、
  477. キーと値の位置がそれぞれ揃うようにしなければなりません。
  478. </para>
  479. <programlisting language="php"><![CDATA[
  480. $sampleArray = array('firstKey' => 'firstValue',
  481. 'secondKey' => 'secondValue');
  482. ]]></programlisting>
  483. <para>
  484. 一方、配列の最初の要素を次の行から始めることもできます。
  485. その場合は、配列を宣言した位置からさらに一段インデントした位置で要素をそろえ、
  486. それ以降のすべての要素を同じインデントで記述するようにします。
  487. 閉じ括弧はそれ単体でひとつの行に記述し、インデント量は配列の宣言と同じ位置になります。
  488. 可読性を高めるため、代入演算子 "=>" の位置はそろえておかなければなりません。
  489. </para>
  490. <programlisting language="php"><![CDATA[
  491. $sampleArray = array(
  492. 'firstKey' => 'firstValue',
  493. 'secondKey' => 'secondValue',
  494. );
  495. ]]></programlisting>
  496. <para>
  497. この宣言を使用する際は、配列の最後の要素の後にもカンマをつけておくようにしましょう。
  498. そうすることで、配列に新たな要素を追加したときにパースエラーが発生する危険性を
  499. 少なくできます。
  500. </para>
  501. </sect3>
  502. </sect2>
  503. <sect2 id="coding-standard.coding-style.classes">
  504. <title>クラス</title>
  505. <sect3 id="coding-standard.coding-style.classes.declaration">
  506. <title>クラス宣言</title>
  507. <para>
  508. クラス宣言は、以下の Zend Framework 命名規約に従わなければなりません。
  509. </para>
  510. <para>
  511. 開始波括弧は常にクラス名の下に書かなければなりません。
  512. </para>
  513. <para>
  514. PHPDocumentor の標準形式のドキュメントブロックがなければなりません。
  515. </para>
  516. <para>
  517. クラス内のコードは、すべて空白 4 文字で字下げします。
  518. </para>
  519. <para>
  520. ひとつの <acronym>PHP</acronym> ファイルにはクラス定義をひとつだけ含めるようにします。
  521. </para>
  522. <para>
  523. クラスファイルの中にクラス以外のコードを追加することもできますが、
  524. お勧めしません。このような場合には、クラス定義とその他のコードの間に
  525. 空行を 2 行挿入しなければなりません。
  526. </para>
  527. <para>
  528. これらの条件を満たすクラス宣言の例です。
  529. </para>
  530. <programlisting language="php"><![CDATA[
  531. /**
  532. * これがドキュメントブロックです
  533. */
  534. class SampleClass
  535. {
  536. // クラスのすべての内容は、
  537. // 空白 4 文字の字下げを使用します。
  538. }
  539. ]]></programlisting>
  540. <para>
  541. 他のクラスを継承したりインターフェイスを実装したりしているクラスの宣言は、
  542. 可能な限りその依存関係も同じ行に含めるようにしなければなりません。
  543. </para>
  544. <programlisting language="php"><![CDATA[
  545. class SampleClass extends FooAbstract implements BarInterface
  546. {
  547. }
  548. ]]></programlisting>
  549. <para>
  550. このように宣言しようとした結果、もし行の長さが <link
  551. linkend="coding-standard.php-file-formatting.max-line-length">最大文字数
  552. </link> を超えてしまう場合は、キーワード "extends" や "implements"
  553. の前で改行してインデント量を一段増やします。
  554. </para>
  555. <programlisting language="php"><![CDATA[
  556. class SampleClass
  557. extends FooAbstract
  558. implements BarInterface
  559. {
  560. }
  561. ]]></programlisting>
  562. <para>
  563. 複数のインターフェイスを実装していて宣言が行の最大長を超える場合は、
  564. インターフェイスを区切るカンマの後で改行して
  565. インターフェイス名の位置がそろうようにインデントします。
  566. </para>
  567. <programlisting language="php"><![CDATA[
  568. class SampleClass
  569. implements BarInterface,
  570. BazInterface
  571. {
  572. }
  573. ]]></programlisting>
  574. </sect3>
  575. <sect3 id="coding-standard.coding-style.classes.member-variables">
  576. <title>クラスのメンバ変数</title>
  577. <para>
  578. メンバ変数は、以下の Zend Framework 変数命名規約に従わなければなりません。
  579. </para>
  580. <para>
  581. クラスの内部で使用する変数は、クラスの先頭 (あらゆるメソッド宣言より前)
  582. で宣言する必要があります。
  583. </para>
  584. <para>
  585. <emphasis>var</emphasis> 構文を使ってはいけません。メンバ変数を宣言する際には
  586. <property>private</property>、<property>protected</property> あるいは <property>public</property>
  587. のいずれかの修飾子を用いてアクセス範囲を指定します。
  588. メンバ変数を public 宣言して外部からアクセスさせることもできますが、
  589. それよりはアクセサメソッド (set &amp; get) を使用する方式のほうを推奨します。
  590. </para>
  591. </sect3>
  592. </sect2>
  593. <sect2 id="coding-standard.coding-style.functions-and-methods">
  594. <title>関数およびメソッド</title>
  595. <sect3 id="coding-standard.coding-style.functions-and-methods.declaration">
  596. <title>関数およびメソッドの宣言</title>
  597. <para>
  598. 関数は、以下の Zend Framework 関数命名規約に従わなければなりません。
  599. </para>
  600. <para>
  601. クラス内でメソッドを宣言する際には、常に
  602. <property>private</property>、<property>protected</property> あるいは
  603. <property>public</property> のいずれかの修飾子を用いてアクセス範囲を指定しなければなりません。
  604. </para>
  605. <para>
  606. クラスと同様、波括弧は関数名の次の行に書かなければなりません。
  607. 関数名と引数定義用の開始括弧の間にはスペースを入れてはいけません。
  608. </para>
  609. <para>
  610. グローバルスコープの関数は、できるだけ使わないようにしましょう。
  611. </para>
  612. <para>
  613. クラス内の関数宣言の例として適切なものを次に示します。
  614. </para>
  615. <programlisting language="php"><![CDATA[
  616. /**
  617. * これがドキュメントブロックです
  618. */
  619. class Foo
  620. {
  621. /**
  622. * これがドキュメントブロックです
  623. */
  624. public function bar()
  625. {
  626. // 関数のすべての内容は、
  627. // 空白 4 文字の字下げを使用します。
  628. }
  629. }
  630. ]]></programlisting>
  631. <para>
  632. 引数リストが <link
  633. linkend="coding-standard.php-file-formatting.max-line-length">行の最大文字数
  634. </link> を超える場合は改行できます。
  635. 関数やメソッドの引数を改行して続ける場合は、
  636. その宣言部よりさらに一段インデントしなければなりません。
  637. そして、閉じ括弧の前にさらに改行を入れます。
  638. 宣言部の閉じ括弧と本体の開始波括弧はスペースをひとつはさんで同じ行に記述し、
  639. そのインデント量は関数やメソッドの宣言位置と同じになります。
  640. そんな場合の例を次に示します。
  641. </para>
  642. <programlisting language="php"><![CDATA[
  643. /**
  644. * これがドキュメントブロックです
  645. */
  646. class Foo
  647. {
  648. /**
  649. * これがドキュメントブロックです
  650. */
  651. public function bar($arg1, $arg2, $arg3,
  652. $arg4, $arg5, $arg6
  653. ) {
  654. // 関数のすべての内容は、
  655. // 空白 4 文字の字下げを使用します。
  656. }
  657. }
  658. ]]></programlisting>
  659. <note>
  660. <para>
  661. 値の参照渡しは、
  662. メソッドの宣言時にパラメータを渡す部分においてのみ可能です。
  663. </para>
  664. </note>
  665. <programlisting language="php"><![CDATA[
  666. /**
  667. * これがドキュメントブロックです
  668. */
  669. class Foo
  670. {
  671. /**
  672. * これがドキュメントブロックです
  673. */
  674. public function bar(&$baz)
  675. {}
  676. }
  677. ]]></programlisting>
  678. <para>
  679. 実行時の参照渡しは禁止されています。
  680. </para>
  681. <para>
  682. 返り値は括弧で囲んではいけません。これは可読性を下げますし、
  683. 将来そのメソッドが参照を返すようになった場合にコードが壊れてしまいます。
  684. </para>
  685. <programlisting language="php"><![CDATA[
  686. /**
  687. * これがドキュメントブロックです
  688. */
  689. class Foo
  690. {
  691. /**
  692. * 間違いです
  693. */
  694. public function bar()
  695. {
  696. return($this->bar);
  697. }
  698. /**
  699. * 正しい形式です
  700. */
  701. public function bar()
  702. {
  703. return $this->bar;
  704. }
  705. }
  706. ]]></programlisting>
  707. </sect3>
  708. <sect3 id="coding-standard.coding-style.functions-and-methods.usage">
  709. <title>関数およびメソッドの使用法</title>
  710. <para>
  711. 関数の引数を指定する際は、引数を区切るカンマの後に空白をひとつ入れます。
  712. 例えば 3 つの引数を受け取る関数をコールする場合の例は、
  713. 以下のようになります。
  714. </para>
  715. <programlisting language="php"><![CDATA[
  716. threeArguments(1, 2, 3);
  717. ]]></programlisting>
  718. <para>
  719. コール時に引数を参照渡しすることは禁じます。
  720. 関数への引数を参照渡しにする方法は、
  721. 関数宣言についての節を参照ください。
  722. </para>
  723. <para>
  724. 引数として配列を受け取る関数については、関数コールの中に
  725. "array" 構文を含め、それを複数行に分けることもできます。
  726. そのような場合の記述法は、以下のようになります。
  727. </para>
  728. <programlisting language="php"><![CDATA[
  729. threeArguments(array(1, 2, 3), 2, 3);
  730. threeArguments(array(1, 2, 3, 'Zend', 'Studio',
  731. $a, $b, $c,
  732. 56.44, $d, 500), 2, 3);
  733. threeArguments(array(
  734. 1, 2, 3, 'Zend', 'Studio',
  735. $a, $b, $c,
  736. 56.44, $d, 500
  737. ), 2, 3);
  738. ]]></programlisting>
  739. </sect3>
  740. </sect2>
  741. <sect2 id="coding-standard.coding-style.control-statements">
  742. <title>制御構造</title>
  743. <sect3 id="coding-standard.coding-style.control-statements.if-else-elseif">
  744. <title>If/Else/Elseif</title>
  745. <para>
  746. <emphasis>if</emphasis> および <emphasis>elseif</emphasis> 系の制御構造では、
  747. 条件を指定する括弧の前に空白をひとつ入れなければなりません。
  748. また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。
  749. </para>
  750. <para>
  751. 括弧で囲まれた条件文の中では、演算子の前後にも空白をいれなければなりません。
  752. また、条件の論理的な区切りを明確にするため、
  753. 条件文の中でも積極的に括弧を使用することを推奨します。
  754. </para>
  755. <para>
  756. 開始波括弧は、条件文と同じ行に記述します。
  757. 終了波括弧は、常に改行してそれのみで記述します。
  758. 波括弧の中では、空白 4 文字の字下げを使用します。
  759. </para>
  760. <programlisting language="php"><![CDATA[
  761. if ($a != 2) {
  762. $a = 2;
  763. }
  764. ]]></programlisting>
  765. <para>
  766. 条件文が <link
  767. linkend="coding-standard.php-file-formatting.max-line-length">行の最大文字数
  768. </link> を超え、さらに複数の条件がある場合は、
  769. それらを複数行にわけて記述できます。その場合は論理演算子の前で改行し、
  770. 条件句の最初の文字がそろうように位置を合わせます。
  771. 条件部の閉じ括弧と本体の開始波括弧はスペースをひとつはさんで同じ行に記述し、
  772. そのインデント量は制御構文の開始位置と同じになります。
  773. </para>
  774. <programlisting language="php"><![CDATA[
  775. if (($a == $b)
  776. && ($b == $c)
  777. || (Foo::CONST == $d)
  778. ) {
  779. $a = $d;
  780. }
  781. ]]></programlisting>
  782. <para>
  783. 後者の記法の意図は、
  784. 後から条件句を追加したり削除したりしたときに問題が起こりにくくすることにあります。
  785. </para>
  786. <para>
  787. "elseif" あるいは "else" を含む "if" 文の場合の決まりは、通常の "if" と同じです。
  788. 次の例は、"if" 文に "else" や "elseif" が含まれる場合のものです。
  789. </para>
  790. <programlisting language="php"><![CDATA[
  791. if ($a != 2) {
  792. $a = 2;
  793. } else {
  794. $a = 7;
  795. }
  796. if ($a != 2) {
  797. $a = 2;
  798. } elseif ($a == 3) {
  799. $a = 4;
  800. } else {
  801. $a = 7;
  802. }
  803. if (($a == $b)
  804. && ($b == $c)
  805. || (Foo::CONST == $d)
  806. ) {
  807. $a = $d;
  808. } elseif (($a != $b)
  809. || ($b != $c)
  810. ) {
  811. $a = $c;
  812. } else {
  813. $a = $b;
  814. }
  815. ]]></programlisting>
  816. <para>
  817. 場合によっては、これらの文で波括弧が必要ないこともあります。
  818. しかし、このコーディング規約では、このような例外を認めません。
  819. "if"、"elseif" あるいは "else" 文では、常に波括弧を使用しなければなりません。
  820. </para>
  821. </sect3>
  822. <sect3 id="coding-standards.coding-style.control-statements.switch">
  823. <title>Switch</title>
  824. <para>
  825. "switch" を使用した制御文では、
  826. 条件を指定する括弧の前に空白をひとつ入れなければなりません。
  827. また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。
  828. </para>
  829. <para>
  830. "switch" 文の中身は、空白 4 文字の字下げを使用します。
  831. 各 "case" 文の中身は、さらに 4 文字ぶん字下げします。
  832. </para>
  833. <programlisting language="php"><![CDATA[
  834. switch ($numPeople) {
  835. case 1:
  836. break;
  837. case 2:
  838. break;
  839. default:
  840. break;
  841. }
  842. ]]></programlisting>
  843. <para>
  844. <property>switch</property> 文の <property>default</property> は、
  845. 決して省略してはいけません。
  846. </para>
  847. <note>
  848. <para>
  849. 各 <property>case</property> の最後に
  850. <property>break</property> や <property>return</property> を記述せず、意図的に
  851. 次の <property>case</property> に処理を流すという書き方をする場合もあるでしょう。
  852. これらの場合を単なる記述漏れと区別するために、<property>case</property> 文で
  853. <property>break</property> あるいは <property>return</property> を指定しなかった場合は
  854. 「意図的に break を省略した」というコメントを含めるようにします。
  855. </para>
  856. </note>
  857. </sect3>
  858. </sect2>
  859. <sect2 id="coding-standards.inline-documentation">
  860. <title>インラインドキュメント</title>
  861. <sect3 id="coding-standards.inline-documentation.documentation-format">
  862. <title>ドキュメントの書式</title>
  863. <para>
  864. ドキュメントブロック ("docblocks") は、phpDocumentor
  865. と互換性のある書式でなければなりません。
  866. phpDocumentor の書式については、このドキュメントの対象範囲外です。
  867. 詳細な情報は <ulink url="http://phpdoc.org/">http://phpdoc.org/</ulink>
  868. を参照ください。
  869. </para>
  870. <para>
  871. Zend Framework のために書かれたコード、あるいはフレームワーク上で操作するコードは、
  872. 各ファイルの最初に「ファイルレベル」の docblock、
  873. そして各クラスの直前に「クラスレベル」の docblock
  874. を含めなければなりません。以下に docblock の例を示します。
  875. </para>
  876. </sect3>
  877. <sect3 id="coding-standards.inline-documentation.files">
  878. <title>ファイル</title>
  879. <para>
  880. <acronym>PHP</acronym> コードを含むすべてのファイルは、最低限これらの
  881. phpDocumentor タグを含むドキュメントブロックを、
  882. ファイルの先頭に記述しなければなりません。
  883. </para>
  884. <programlisting language="php"><![CDATA[
  885. /**
  886. * ファイルについての短い説明
  887. *
  888. * ファイルについての長い説明 (もしあれば)...
  889. *
  890. * LICENSE: ライセンスに関する情報
  891. *
  892. * @category Zend
  893. * @package Zend_Magic
  894. * @subpackage Wand
  895. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  896. * @license http://framework.zend.com/license BSD License
  897. * @version $Id:$
  898. * @link http://framework.zend.com/package/PackageName
  899. * @since File available since Release 1.5.0
  900. */
  901. ]]></programlisting>
  902. <para>
  903. <property>@category</property> アノテーションの値は "Zend" でなければなりません。
  904. </para>
  905. <para>
  906. <property>@package</property> アノテーションも必須で、
  907. ファイルに含まれるクラスのコンポーネント名と同じでなければなりません。
  908. 一般的には、これは "Zend" プレフィックスとコンポーネント名のふたつの部分からなります。
  909. </para>
  910. <para>
  911. <property>@subpackage</property> アノテーションはオプションです。
  912. 指定する場合は、サブコンポーネント名からクラスのプレフィックスを除いたものとしなければなりません。
  913. 上の例の場合は、ファイルに含まれるクラス名が "<classname>Zend_Magic_Wand</classname>" であるか、
  914. そのクラス名をプレフィックスの一部として使っているのでしょう。
  915. </para>
  916. </sect3>
  917. <sect3 id="coding-standards.inline-documentation.classes">
  918. <title>クラス</title>
  919. <para>
  920. 各クラスには、最低限これらの phpDocumentor タグを含む
  921. docblock が必要です。
  922. </para>
  923. <programlisting language="php"><![CDATA[
  924. /**
  925. * クラスについての短い説明
  926. *
  927. * クラスについての長い説明 (もしあれば)...
  928. *
  929. * @category Zend
  930. * @package Zend_Magic
  931. * @subpackage Wand
  932. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  933. * @license http://framework.zend.com/license BSD License
  934. * @version Release: @package_version@
  935. * @link http://framework.zend.com/package/PackageName
  936. * @since Class available since Release 1.5.0
  937. * @deprecated Class deprecated in Release 2.0.0
  938. */
  939. ]]></programlisting>
  940. <para>
  941. <property>@category</property> アノテーションの値は "Zend" でなければなりません。
  942. </para>
  943. <para>
  944. <property>@package</property> アノテーションも必須で、
  945. そのクラスが属するコンポーネントの名前と同じでなければなりません。
  946. 一般的には、これは "Zend" プレフィックスとコンポーネント名のふたつの部分からなります。
  947. </para>
  948. <para>
  949. <property>@subpackage</property> アノテーションはオプションです。
  950. 指定する場合は、サブコンポーネント名からクラスのプレフィックスを除いたものとしなければなりません。
  951. 上の例の場合は、ファイルに含まれるクラス名が "<classname>Zend_Magic_Wand</classname>" であるか、
  952. そのクラス名をプレフィックスの一部として使っているのでしょう。
  953. </para>
  954. </sect3>
  955. <sect3 id="coding-standards.inline-documentation.functions">
  956. <title>関数</title>
  957. <para>
  958. オブジェクトのメソッドを含めたすべての関数には、
  959. 最低限以下の内容を含む docblock が必要です。
  960. </para>
  961. <itemizedlist>
  962. <listitem><para>関数についての説明</para></listitem>
  963. <listitem><para>すべての引数</para></listitem>
  964. <listitem><para>返り値</para></listitem>
  965. </itemizedlist>
  966. <para>
  967. "@access" タグは必要ありません。なぜなら、
  968. アクセスレベルについては関数宣言の際の
  969. "public"、"private" あるいは "protected" によってわかっているからです。
  970. </para>
  971. <para>
  972. 関数/メソッドが例外をスローする場合には、すべての既知の例外クラスに対して
  973. @throws を使用します。
  974. </para>
  975. <programlisting language="php"><![CDATA[
  976. @throws exceptionclass [description]
  977. ]]></programlisting>
  978. </sect3>
  979. </sect2>
  980. </sect1>
  981. </appendix>
  982. <!--
  983. vim:se ts=4 sw=4 et:
  984. -->