インデントと空白
コードのインデントにはタブ キーの代わりに 2 つのスペースを使用します (notepad++、Eclipse、およびその他のエディターはこの構成をサポートしています);
行末に空白文字があってはなりません
n (Unix 改行) は必要ですrn (Windows 改行) の代わりに使用します
すべてのファイルは空行で終わる必要があります
演算子
+、-、=、!=、==、> などのすべての二項演算子 (2 つの値の間の演算子) は演算子の両端に必要です $ などのスペースを残します$foo=$bar の代わりに foo = $bar を使用する必要があります。
++ などのすべての単項演算子 (1 つの義務でのみ動作する演算子) は、値と演算子の間にスペースを追加しないでください
キャスト
(type) と、(int) $mynumber など、キャストされる変数の間にスペースを追加する必要があります。
制御構造
制御構造には、if、for、while、switch などが含まれます。単純な if ステートメント構造の例:
コードをコピーします コードは次のとおりです:
if (condition1 ||condition2) {
action1;
}
elseif (condition3 &&condition4) {
action2 ;
}
else {
defaultaction;
}
(注: "else if" を使用しないでください。常に elseif を使用してください。)
制御ステートメントのキーワードと左括弧の間にはスペースが必要です。関数呼び出しとは区別されます。
中括弧はオプションの場合でも常に使用する必要があります。これにより、コードの可読性が向上し、ネストによって発生する論理エラーが軽減されます。
switch ステートメントの構造例:
コードをコピー コードは次のとおりです:
switch (条件) {
case 1:
action1;
Break;
case 2:
action2;
Break;
default :
defaultaction ;
}
do-while文の構造例:
do {
actions;
} while ($condition);
行の長さと折り返し(Line length and折り返し)
通常は、それぞれの長さコード行 80 文字を超えてはなりません
次の状況では、行の長さが 80 文字を超えることがあります: 行に長すぎる関数名、関数/クラス定義、変数宣言などが含まれている場合
読みやすく理解しやすくするために、行の長さは 80 文字を超えることがあります。制御構造の長さは 80 文字を超えることができます
コードをコピーします コードは次のとおりです:
if ($something['with']['something']['else']['in ']['here'] ==
mymodule_check_something( $whatever['else'])) {
...
}
if (isset($something['what']['ever']) && $something[ 'what']['ever'] > $finity
&& user_access('galaxy')) {
...
}
// 複雑さの低い非自明な条件も許容されますが、常にそうする必要があります
//文書化され、特定のチェックが行われる理由が説明されています。
if (preg_match('@(/|\)(..|~)@', $target) && strpos($target_dir, $repository)
!== 0) {
Return FALSE;
}
制御条件 (条件) は複数行で記述しないでください。
コードを記述する際は、読みやすく理解するために、制御条件を適切に分割する必要があります。
コードをコピーする。 コードは次のとおりです:
// これは行わないでください!
if ((isset($key) && !empty($user->uid) && $key == $user->uid ) || (isset($user-
>cache) ? $user ->cache : '') == ip_address() || isset($value) && $value >= time()))
{
...
}
制御条件を分割すると、読みやすいだけでなく、なぜそのような条件判断が行われるのかコメントを追加するのにも便利です
コードをコピーします コードは次のとおりです:
// キーは現在のユーザーの ID と一致する場合にのみ有効です。そうでない場合は、他の
/ / ユーザーは任意のユーザーのものにアクセスできます。
$is_valid_user = (isset($key) && !empty($user-> uid) && $key == $user->uid);
// セッション スプーフィングを防ぐために、IP はキャッシュと一致する必要があります。
$is_valid_cache = (isset($user->cache) ? $user->cache = = ip_address() : FALSE);
//あるいは、リクエスト クエリ パラメータが将来のものである場合、それは常に有効です
// いずれにしても銀河は爆発して崩壊するためです。
$is_valid_query = $is_valid_cache || ( isset($value) && $value >= time());
if ($is_valid_user || $is_valid_query) {
...
}
関数呼び出し
関数を呼び出すときは、最後のパラメーターを除き、関数名と左括弧の間にスペースを入れません。
$var = foo ($bar) のように、各パラメーターの後にスペースを続ける必要があります。 , $baz, $quux);
前述したように、等号の両側にはスペースが必要です。一連の関連するステートメントがある場合は、読みやすくするために、次のようにスペースの数を適切に増やすことができます:
$short = foo($bar);
$long_variable = foo($baz);
関数の宣言
デフォルト値を含むパラメータは最後に配置する必要があります。関数が戻り値を持つ場合は、わかりやすい値を返すようにしてください:
コードをコピーします コードは次のとおりです。次のように:
function funstuff_system ($field) {
$system["description"] = t("このモジュールは投稿に面白いテキストをランダムに挿入します。");
return $system[$field];
}
クラス コンストラクターの呼び出し (クラス コンストラクターの呼び出し)
パラメーターなしでクラス コンストラクターを呼び出す場合は、必ず括弧を含めてください
$foo = new MyClassName();
パラメータ付きのクラス コンストラクター
$foo = new MyClassName($arg1, $arg2);
クラス名として変数を使用する場合は、まず変数に値を割り当ててから、クラス コンストラクターを呼び出す必要があります。
コードをコピー コードは次のとおりです:
$bar = 'MyClassName';
$foo = new $bar();
$foo = new $bar($arg1, $arg2);
Array (配列)
配列の値はスペースで区切られ、代入演算子記号 (=>) の周囲にもスペースが含まれている必要があります:
$some_array = array('hello', ' world', 'foo' => 'bar');
宣言された配列の文字長が 80 文字を超える場合 (通常はフォームやメニューを作成する場合)、各要素を別の行に記述してインデントする必要があります:
コードをコピーします コードは次のとおりです:
$form['title '] = array(
'#type' => 'textfield',
'#title' => t('Title') ,
'#size' => 60,
'#maxlength' => 128,
'#description' => t('ノードのタイトル。'),
);
注意:最后一个数组元素末尾有一个逗号,这并不是手误,而是避免有新元素加入到最后之后因缺少逗号而出现解析错误。(从某种程度上来讲,在最后一个数组元素末尾加上逗号是一种推荐的做法,甚至在向drupal.org提交代码时,一些代码规范检测脚本会因为最后一个元素没有添加逗号而出现警告提示。)
引号(Quotes)Drupal 对于单引号和双引号的使用并没有很强硬的标准,只需在同一模块内保持用法的统一即可。
使用单引号的效率要高于双引号,因为解析器不需要到引号之间查找变量。以下是使用双引号的两种情况:
引号中间带有变量,如"
$header
"
引号中间带有单引号,使用双引号可避免对单引号的转义 "He's a good person." 当然也可以使用单引号,但 .pot 解析器不能很好的处理这种情况,而且看起来怪怪的'He\'s a good person.'
字符串连接(String Concatenations)
在点与要连接字符串之间需要加入空格以加强代码可读性:
如果只是简单地连接变量,可以使用双引号
使用连接赋值符(.=)时,需要在符号两侧预留空格
注释(Comment)
注释规范单独在 Doxygen及注释格式规范页面 讨论
引入代码(Including Code)
任何无条件引用文件的情况下,使用 require_once(), 任何有条件引用文件的情况,则使用 include_once(). 这两条语句都会保证文件只被引入一次。
当从当前目录或子目录引入代码时,始终以点路径开头
include_once ./includes/mymodule_formatting.inc
在 Drupal 7 及更新版本中,使用 DRUPAL_ROOT 常量:
require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
PHP 代码标签(PHP Code Tags)
始终使用来界定PHP代码而不使用要 ?>。这是为了遵循Drupal规范,同时也便于代码在其它系统和平台中被引用。
自 Drupal 4.7 开始,最后的 ?> 都故意被忽略不写,原因如下:
移除它可以避免在文件末尾出现空白字符,这些空白字符可能导致“文件头已发送(header already sent)”错误,XHTML/XML验证错误,及其它问题
PHP 官方说明 结尾的PHP界定符是可选项
PHP.net 自身也移除了文件末尾的界定符(如 prepend.inc )
分号(Semicolons)
PHP 语言要求除了代码块以外,大多数行尾都要跟上分号。Drupal 代码规范同样有此要求,并且对于代码块也是如此。以下是一个单行代码块的示例:
-- YES
-- NO
示例 URL(Example URL)
使用 example.com 表示所有示例 URLs
命名规范(Naming Conventions)
函数与变量(Functions and Variables)
函数与变量名称应该使用小写字母,且单词之间使用下划线分隔。函数应该使用模块组/模块名称作为前缀,以避免与不同模块间的冲突。
持久变量(Persistent Variables)
持久变量是指通过 variable_get()/variable_set() 函数取得和设置的变量,变量名称应该使用小写字母,且单词之间使用下划线进行分隔。持久变量也应该使用模块组/模块名称作为前缀,以避免与不同模块间的冲突。
常量(Constants)
常量始终要求使用全大写字母,且单词之间使用下划线进行分隔。(包括PHP内置常量 TRUE, FALSE, NULL)
模块中定义的常量需始终使用大写的模块名称作为前缀。
在 Drupal 8 及之后,应使用 const 关键词代替 define() 函数来定义常量,因为效率更高
注意 const 不能用于PHP表达式,因此在条件判断和非字面值(non-literal value ???)时,还是应当使用 define() 函数
全局变量(Global Variables)
定义全局变量时,应当使用下划线加模块/主题名称开头
类(Class)
类名应使用驼峰式命名(即单词首字母大写)
类中的方法(函数)和属性(成员变量)应使用首字母小写的驼峰式
定义访问权限时,使用 protected 而代替 private,从而其它的类可以在必要时扩展和更新方法。Protected 和 public 函数和变量不应以下划线开头。
更多关于 面向对象的编码规范
文件名(Filename)
所有文档文件都应加上 .txt 后缀,以便于 Windows 用户查看。同时,所有文件名称应该全部大写,而文件后缀应该全部小写。
如 README.txt, INSTALL.txt, TODO.txt, CHANGELOG.txt 等等。
補助モジュールとツール
Coder モジュール: 上記のコード仕様の一部に従い、コードをレビューして変更できます
Drupal Code Sniffer: コード仕様検出ツール
PAReview.sh: サンドボックスでコード仕様検出スクリプトも処理します。上記のすべてのコード仕様を厳密に遵守し、変更の提案を行ってください。
http://www.bkjia.com/PHPjc/327453.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327453.html技術記事インデントと空白 コードのインデントにはタブ キーの代わりに 2 つのスペースを使用します (notepad++、Eclipse、およびその他のエディターはこの設定をサポートしていません)。