アットウィキロゴ
#nofollow #norelated

社内PHPコーディング規約 [#e71f308e]


命名規則 [#i2661d37]

ファイルの拡張子 [#raf6db52]

classファイル .class.php
テンプレートファイル .tpl、.html(どちらかに統一)
上記以外のファイル .php

クラス名(ファイル名) [#a4b24b98]

  • クラス名には英数字のみ使用。
  • クラス名から内容が理解しやすい名前を付ける。略語の使用は極力控えること。
  • クラス名に動詞を含める場合、基本的に "動詞 + 名詞" の形式にする。
  • クラスファイルの拡張子は ".class.php" で統一。~
(クラス名が DebugUtil であれば、ファイル名は "DebugUtil.class.php" となる)

Exceptionクラス [#j5491f3a]

  • 例外クラスは、クラス名のサフィックスとして "Exception" を付ける。~
例外名が "OutOfMemory" である場合、クラス名は "OutOfMemoryException"、~
ファイル名は "OutOfMemoryException.class.php" になる。

変数名 [#r942a76b]

  • 変数は$(ドル)マークから始まる
  • 変数名は、アルファベットもしくは「_(アンダースコア)」から始まり、~任意の数のアルファベットもしくは数字もしくはアンダースコアが続く

クラス定数 [#b60843c4]

  • 基本的に大文字とし、アルファベットもしくは「_(アンダースコア)」が使用可能。~
  • クラス定数を定義する場合は、constを使用する。(PHP5より)~

メンバ変数 [#j24564cd]


  • メンバ変数は「_(アンダースコア)」から始まる。

メソッド名 [#f3dae122]

  • メソッド名には英数字のみ使用可能です。(メソッド名に数字を含めることはお勧めできません)
  • メソッド名から内容が理解しやすい名前を付けるべきです。略語の使用は極力控えて下さい。
  • メソッド名は Camel形式に従う必要があります
  • メソッド名に動詞を含める場合、基本的に "動詞 + 名詞" の形式にする必要があります。

DAOメソッド [#qe33940a]

DAO メソッドは、Data Access Object という名の通り、使用目的に合わせて分かりやすい名前を付けるべきです。~
下表にメソッド命名のいくつかの例を示します。

function return example name
レコードの取得 object find, fetchRow, load...
array find{condition}Hash, findToArray...
全レコードの取得 object findAll, find{condition}Hash, findObject, findToPager...
array findAllHash, findToArray...
レコードが存在するかどうかチェック bool isExists{condition}, search...
レコードの追加 bool, int, void insert, create, save...
レコードの更新 bool, int, void update, modify, saveOrUpdate...
レコードの削除 bool, int, void delete, remove...

テンプレート [#rb5df013]

  • テンプレートファイルは、対応するアクション名を全て小文字に変換した名前を使用する。~
クラス名が複数の単語から構成される場合、単語の区切りをアンダーバー ("_") で区切る。~
(FooBarAction.class.php であれば、テンプレート名は foo_bar.tpl)
  • テンプレートファイルの拡張子は tpl


共通 [#ka2cf7ca]

対象性 [#ee0d3fa1]

  • クラス名、メソッド名を付ける場合は、名前の対称性に注意する。~
    • add / remove
    • insert / delete
    • get/ set
    • start / stop
    • begin / end
    • send / receive
    • first / last
    • get / release
    • put / get
    • up / down
    • show / hide
    • source / target
    • open / close
    • source / destination
    • increment / decrement
    • lock / unlock
    • old / new
    • next / previous

フォルダ構成 [#f331dc49]



ファイルの構成 [#hf30b8e1]

ドキュメンテーションコメント(phpDocumentor) [#hcd6fd1a]

  • ファイル
/** 
 * ファイルについての短い説明 
 * 
 * ファイルについての長い説明 (もしあれば)... 
 * 
 * LICENSE: ライセンスに関する情報 
 * 
 * @copyright  2005 Zend Technologies 
 * @license    http://www.zend.com/license/3_0.txt   PHP License 3.0 
 * @version    CVS: $Id:$ 
 * @link       http://dev.zend.com/package/PackageName 
 * @since      File available since Release 1.2.0
*/

  • クラス
/** 
 * クラスについての短い説明 
 * 
 * クラスについての長い説明 (もしあれば)... 
 * 
 * @copyright  2005 Zend Technologies 
 * @license    http://www.zend.com/license/3_0.txt   PHP License 3.0 
 * @version    Release: @package_version@ 
 * @link       http://dev.zend.com/package/PackageName 
 * @since      Class available since Release 1.2.0 
 * @deprecated Class deprecated in Release 2.0.0
 */

  • メソッド

@throws exceptionclass [description]

インデント [#v4207c22]

  • インデントの単位として,4個分の半角スペースを推奨する.
  • インデントが実際に半角スペースによって行われるかタブによって行われるかについては,これを規定しない.
  • タブはすべて(4個ではなく)8個分の半角スペースでなければならない.

行の長さ [#vf5fdcb0]

  • 行が半角80文字を超えないようにする.

行の折返し [#r15e826b]

式を1行で書ききれない場合,以下の原則に基づいて複数の行に分割する.
  • コンマの後で区切る.
  • 演算子の前で区切る.
  • low-level よりも hi-level において分割する.
  • 2つ目以降のインデントでは,前の行と同じ位置に左端を揃える.

以上のルールによって分かりにくいコードになったり右の方に偏ってしまう場合には,4個分の半角スペースではなく8個分の半角スペースを使用する.

    • メソッド呼び出しの分割例
someMethod(longExpression1, longExpression2, longExpression3, 
       longExpression4, longExpression5);

var = someMethod1(longExpression1,
               someMethod2(longExpression2,
                       longExpression3)); 

    • 数式を分割する例
longName1 = longName2 * (longName3 + longName4 - longName5)
          + 4 * longname6; // こちらの方が良い

longName1 = longName2 * (longName3 + longName4
                      - longName5) + 4 * longname6; // これは避ける

    • メソッド宣言をインデントする例

// 慣例的なインデント
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
          Object andStillAnother) {
   ...
}

// 深いインデントを避けるために8個分の半角スペースをとってインデント
private static synchronized horkingLongMethodName(int anArg,
       Object anotherArg, String yetAnotherArg,
       Object andStillAnother) {
   ...
}

    • if 文での行の折り返し例(if 文での行の折り返しは,4個分の半角スペースのインデントでは本体(ブロック内部)の見通しが悪くなるため,一般的に8個分の半角スペースを使う。)
// こうしちゃいけない
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { // 悪い改行
    doSomethingAboutIt();            // この行が分かりにくくなる
} 

// こうしよう
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
} 

// あるいはこうする
if ((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
} 

    • 三項演算子の記述例
alpha = (aLongBooleanExpression) ? beta : gamma;  

alpha = (aLongBooleanExpression) ? beta
                                 : gamma;  

alpha = (aLongBooleanExpression)
        ? beta 
        : gamma;  

コメント [#f6453624]

インプリメンテーション・コメント [#gf7dd04e]

  • コメントの記述には、/* .... */ 形式もしくは、 // ... 形式を使用する。
  • コードに対するコメントか,特定の実装に対するコメントである。

ドキュメンテーション・コメント(ドキュメンテーション・コメントは............) [#u179fb3e]

  • コメントの記述には、/** ...*/ 形式を使用する。
  • そのコードの実装に依存しない視点での定義を記述し,開発者がソースコードを見ないでもその役割を把握できるようにするものである。

コメント記述時の留意点 [#e3dd3e72]

コメントは,コードの概観と,コード自体からは読み取ることのできない付加的な情報を与えるものであるべきである.
また,そのプログラムを読んで理解するのに適した情報のみを含んでいるべきである。
たとえば,対応したパッケージがどのように構築されてどのディレクトリに保存されるかといったような情報は,コメントに含まれるべきではない。

注意:頻繁にコメントを書かなければいけないような状況は,それが良くない品質のコードであることを反映している場合がしばしばある.もしもコメントを書かなければいけないという強迫観念を感じたときは,そのコードをもっと分かりやすく書くことができないか熟考する.;

宣言 [#qe55addc]

1つの行に書く宣言の数 [#n1e784e3]


  • 行につき1つの宣言だけを書くようにして,コメントを書きやすくする。

var $_level; // インデントのレベル
var $_size;  // テーブルのサイズ

  • 複数の宣言がある場合は、タブ等を使用し揃える。

public       $_id;           // ID
protected    $_level;        // インデントのレベル
private      $_size;         // テーブルのサイズ

配置 [#vc72fec8]

  • 宣言は,ブロックの冒頭においてのみ行う(ブロックとは,"{" と "}" で囲まれたコード)。
最初に使われるまで宣言するのを待つようなことはしない。
プログラマを混乱させ,そのスコープ内でのコードのポータビリティを妨げることになる。

function myMethod() {
   $int1 = 0;         // メソッド・ブロックの開始

   if (condition) {
       $int2 = 0;     // if ブロックの開始
       ...
   }
}

クラスとインターフェースの宣言 [#g0bb440b]

  • メソッド名と "(" との間にはスペースを空けない
  • 宣言文の後に来る "{" の前には1個の半角スペースを空ける
  • "}" は,ブロックの中が空で "{" の直後に来るような場合を除いて,それが対応する文と同じインデントレベルにインデントする。

class Sample extends Object {
   private $_hoge;
   private $_fuga;

   public function __construct() {}

   public function setIvar($i) {
       $_hoge = $i;
   }

   private function emptyMethod() {}

     ...
}


文 [#aeded3c9]

単一の文 [#u00344db]

  • つの行には,1つの文だけを書く。

if 文,if-else 文,if else-if else 文 [#ia58a69d]

  • if-else 文は,以下の形式で書く。

 if (条件) {
    文;
}

if (条件) {
    文;
} else {
    文;
}

if (条件) {
    文;
} else if (条件) {
    文;
} else{
    文;
}

for 文 [#k9711dc3]

  • for 文は,以下の形式で書く。

for (初期化; 条件; 更新) {
    文;
}

while 文 [#z1611c82]

  • while 文は,以下の形式で書く。

while (条件) {
    文;
}

do-while 文 [#uacf7d2d]

  • do-while 文は,以下の形式で書く。

do {
    文;
} while (条件);

switch 文 [#zd0da4ce]


switch 文は,以下の形式で書く。

switch (条件) {
    case 0:
        文;
       /* 次の行も実行する */

    case 1:
       文;
       break;

    case 2:
       文;
       break;

    default:
       文;
       break;
}

try-catch 文 [#k5dc4ae9]

  • try-catch 文は、以下の形式で書く。

try {
    文;
} catch (ExceptionClass $e) {
    文;
}

空白 [#w9da3edd]

空白行 [#l5e4ba23]

  • 連続した2行の空白行が常に使用されるべき状況
    • ソースファイル内の各セクション間の区切り
  • 1つの空白行が常に使用されるべき状況
    • 各メソッド間の区切り
    • メソッド内のローカル変数と最初の文との間の区切り
    • メソッドの中の論理的なセクションを区切って可読性を上げる場合

空白スペース [#v4f36654]

  • 空白スペースが使用されるべき状況
    • メソッドの引数を区切るコンマ(,)の後には,空白スペースを1つ入れる
    • for 文の中の式は,「;」の後に空白スペースを入れて分割する。
 for ($expr1; $expr2; $expr3)

ネーミング [#u001a35f]




















参考資料:代表的な命名記法 [#p00d9658]

  • Camel記法~
先頭単語のみすべて小文字とし、それ以降の単語は先頭文字のみ大文字。~
単語間の接続は何も設けない。~
例:myFirstName ~

  • Pacal記法~
すべての単語の先頭文字を大文字とし、それ以外の文字はすべて小文字。~
単語間の接続は何も設けない。~
例:MyFirstName ~


  • UnderBar記法~
すべての単語は小文字。~
単語間の接続にアンダーバー( _ )を使用する。~
例:my_first_name

参考資料:PHP内部で使用されている名前 [#fdc5c819]

  • 予約語

  • 定義済み変数

  • 定義済みクラス

  • 定義済み定数
最終更新:2007年02月14日 15:46