Cakeの開発者は以下のコーディング規約を使います。
その他のCakeのコンポーネント(訳注:原文 CakeIngredients 、ケーキの材料のこと)の開発でも同じ規約に従うことが推奨されます。
CakePHP Code Sniffer を使って、コードが規約に沿っているかどうかをチェックすることができます。
新しい機能は、そのテストが無い限り、追加してはなりません。 このテストはレポジトリにコミットされる前に合格する必要があります。
インデントには単一のタブが用いられます。
従って、インデントはこのようになります:
// 基本レベル
// レベル1
// レベル2
// レベル1
// 基本レベル
または:
$booleanVariable = true;
$stringVariable = "大鹿";
if ($booleanVariable) {
echo "真偽値はtrueです";
if ($stringVariable == "大鹿") {
echo "大鹿に遭遇しました";
}
}
制御構造は例えば “if“、”for“、”foreach“、”while“、”switch“などです。 下記に、 “if” の例を示します:
if ((expr_1) || (expr_2)) {
// action_1;
} elseif (!(expr_3) && (expr_4)) {
// action_2;
} else {
// default_action;
}
// 間違い=中括弧が無い、ステートメントの場所が悪い
if (expr) statement;
// 間違い=中括弧が無い
if (expr)
statement;
// よろしい
if (expr) {
statement;
}
// 間違い=インラインの代入
if ($variable = Class::function()) {
statement;
}
// よろしい
$variable = Class::function();
if ($variable) {
statement;
}
三項演算子は、三項演算子全体が1行に収まる場合に許容されます。 長い三項演算子は if else ステートメントに分割するべきです。 どのような場合でも、三項演算子はネストしてはいけません。 見やすさのために、丸括弧を三項の条件チェックの周りに使うことができます(任意):
//良い。シンプルで読みやすい
$variable = isset($options['variable']) ? $options['variable'] : true;
//ネストされた三項はダメ
$variable = isset($options['variable']) ? isset($options['othervar']) ? true : false : false;
関数は、関数の名前と開き括弧の間に空白を入れて呼び出してはいけません。 関数呼び出しの引数各々に対して単一の空白がある必要があります:
$var = foo($bar, $bar2, $bar3);
上記をご覧の通り、イコール記号(=)の両サイドには単一の空白がある必要があります。
関数の定義の例:
function someFunction($arg1, $arg2 = '') {
if (expr) {
statement;
}
return $var;
}
デフォルトを用いた引数は、関数の定義の最後に置く必要があります。 関数は何かを、少なくともtrueかfalseを、関数呼び出しが成功したかどうかを判定できるように、返すように作ってみてください:
function connection($dns, $persistent = false) {
if (is_array($dns)) {
$dnsInfo = $dns;
} else {
$dnsInfo = BD::parseDNS($dns);
}
if (!($dnsInfo) || !($dnsInfo['phpType'])) {
return $this=>addError();
}
return true;
}
イコール記号の両サイドには空白を置きます。
全てのコメントは英語で書かれ、コードのコメントブロックを明確な方法で記述する必要があります。
コメントは以下の phpDocumentor タグを含めることができます:
PhpDocタグはJavaのJavaDocタグによく似ています。 タグはドキュメントブロックの行の最初のもののみ処理されます。 例を挙げます:
/**
* タグの例。
* @author このタグは解析されますが、この@versionは無視されます
* @version 1.0 このタグも解析されます
*/
/**
* インラインphpDocタグの例。
*
* この関数は世界征服のためにfoo()を使って身を粉にして働きます。
*/
function bar() {
}
/**
* Foo function
*/
function foo() {
}
ファイルの最初のブロック以外のコメントブロックは、常に新しい行を先に置く必要があります。
クラスまたはライブラリを伴うファイルを読み込む場合、 require_once 関数のみを常に使用してください。
常にショートタグ(<? ?>)の代わりに、ロングタグ(<?php ?>)を使ってください。
変数名はできる限り説明的に、しかしできる限り短くもしてください。 通常の変数は小文字で始まり、複数の単語の場合はキャメルバックで書く必要があります。 オブジェクトを含む変数は大文字で始まり、何らかの方法で変数がオブジェクトとなっているクラスに関連したものになるべきです。 例:
$user = 'John';
$users = array('John', 'Hans', 'Arne');
$Dispatcher = new Dispatcher();
メソッドと変数の為の、PHP5のprivateとprotectedキーワードを使用してください。 加えて、protectedなメソッドまたは変数の名前は単一のアンダースコア(“_”)から始まります。 例:
class A {
protected $_iAmAProtectedVariable;
protected function _iAmAProtectedMethod() {
/*...*/
}
}
privateなメソッドまたは変数の名前は二つののアンダースコア(“__”)から始まります。 例:
class A {
private $__iAmAPrivateVariable;
private function __iAmAPrivateMethod() {
/*...*/
}
}
privateなメソッドまたは変数を回避し、protectedなそれらを用いることを試してみて下さい。 後者はサブクラスからアクセスや修正が可能です。一方で、privateでは拡張や再利用ができません。 privateは、テストの実施もより難しくなります。
メソッドチェーンは複数の行にまたがる複数のメソッドとなり、単一のタブでインデントする必要があります:
$email->from('foo@example.com')
->to('bar@example.com')
->subject('A great message')
->send();
全てのURLとメールアドレスの例には、「example.com」、「example.org」、「example.net」を使用してください。 例を挙げます:
example.com ドメインはこの(RFC 2606 をみてください)為に予約されており、ドキュメント中か例として使うことが推奨されています。
ドキュメントブロックの中で使う変数の型:
定数は大文字で定義する必要があります。
define('CONSTANT', 1);
もし定数の名前が複数の単語でできている場合は、アンダースコア文字によって分割する必要があります。 例:
define('LONG_NAMED_CONSTANT', 2);