|
縮進(jìn)與空白字符(Indenting and Whitespace)
使用 2 個(gè)空格而不使用 tab 鍵進(jìn)行代碼縮進(jìn)(notepad++, Eclipse 等編輯器均支持此項(xiàng)配置);
行尾不應(yīng)該有空白字符
應(yīng)使用 /n (Unix換行符),而不是 /r/n (Windows 換行符)
所有文件均應(yīng)以一個(gè)空行結(jié)尾
運(yùn)算符(Operators)
所有二元運(yùn)算符(二個(gè)值之間的運(yùn)算符),如 +, -, =, !=, ==, > 等等,在運(yùn)算符兩端均需留有一個(gè)空格,如應(yīng)該使用 $foo = $bar 而不是 $foo=$bar。
所有一元運(yùn)算符(只操作一個(gè)值班的運(yùn)算符),例如 ++,在值與運(yùn)算符之間則不應(yīng)加入空格
轉(zhuǎn)型(Casting)
在 (type) 與要轉(zhuǎn)型的變量之間應(yīng)加入一個(gè)空格,如 (int) $mynumber.
控制結(jié)構(gòu)(Control Structures)
控制結(jié)構(gòu)包含 if, for, while, switch 等等,下面是一個(gè)簡(jiǎn)單的 if 語(yǔ)句結(jié)構(gòu)示例:
復(fù)制代碼 代碼如下:
if (condition1 || condition2) {
action1;
}
elseif (condition3 && condition4) {
action2;
}
else {
defaultaction;
}
(Note: 不要使用 "else if" -- 總是使用 elseif.)
控制語(yǔ)句的關(guān)鍵詞與左邊括號(hào)之間應(yīng)該有一個(gè)空格,以此來(lái)與函數(shù)調(diào)用進(jìn)行區(qū)分。
即使在大括號(hào)是可選的情況下,也應(yīng)當(dāng)總是使用大括號(hào)。這樣可以加強(qiáng)代碼的可讀性以及減少因嵌套帶來(lái)的邏輯錯(cuò)誤。
switch 語(yǔ)句結(jié)構(gòu)示例:
復(fù)制代碼 代碼如下:
switch (condition) {
case 1:
action1;
break;
case 2:
action2;
break;
default:
defaultaction;
}
do-while 語(yǔ)句結(jié)構(gòu)示例:
do {
actions;
} while ($condition);
行長(zhǎng)度與封裝(Line length and wrapping)
通常情況下,每行代碼的長(zhǎng)度不應(yīng)超過80個(gè)字符
以下情況,行長(zhǎng)度可超過80個(gè)字符:當(dāng)行內(nèi)包含過長(zhǎng)的函數(shù)名稱、函數(shù)/類定義、變量聲明等
為方便閱讀和理解,控制結(jié)構(gòu)的行長(zhǎng)度可超過80個(gè)字符
復(fù)制代碼 代碼如下:
if ($something['with']['something']['else']['in']['here'] ==
mymodule_check_something($whatever['else'])) {
...
}
if (isset($something['what']['ever']) && $something['what']['ever'] > $infinite
&& user_access('galaxy')) {
...
}
// Non-obvious conditions of low complexity are also acceptable, but should
// always be documented, explaining WHY a particular check is done.
if (preg_match('@(/|//)(/./.|~)@', $target) && strpos($target_dir, $repository)
!== 0) {
return FALSE;
}
控制條件(condition)不應(yīng)該寫作多行
控制條件應(yīng)該適當(dāng)拆分以便于閱讀和理解,編寫代碼時(shí)要避免以下情形:
復(fù)制代碼 代碼如下:
// DON'T DO THIS!
if ((isset($key) && !empty($user->uid) && $key == $user->uid) || (isset($user-
>cache) ? $user->cache : '') == ip_address() || isset($value) && $value >= time()))
{
...
}
將控制條件進(jìn)行拆分,不僅便于閱讀,同時(shí)也方便添加注釋讓人知道為何進(jìn)行這樣的條件判斷
復(fù)制代碼 代碼如下:
// Key is only valid if it matches the current user's ID, as otherwise other
// users could access any user's things.
$is_valid_user = (isset($key) && !empty($user->uid) && $key == $user->uid);
// IP must match the cache to prevent session spoofing.
$is_valid_cache = (isset($user->cache) ? $user->cache == ip_address() : FALSE);
// Alternatively, if the request query parameter is in the future, then it
// is always valid, because the galaxy will implode and collapse anyway.
$is_valid_query = $is_valid_cache || (isset($value) && $value >= time());
if ($is_valid_user || $is_valid_query) {
...
}
函數(shù)調(diào)用(Function Calls)
調(diào)用函數(shù)時(shí),函數(shù)名與左括號(hào)之間沒有空格,除最后一個(gè)參數(shù)外,每個(gè)參數(shù)后的 , 都應(yīng)跟上一個(gè)空格,如:
$var = foo($bar, $baz, $quux);
如之前所說(shuō),等號(hào)兩邊應(yīng)該各有一個(gè)空格。當(dāng)有一系列相關(guān)語(yǔ)句時(shí),出于可讀性的考慮,可以適當(dāng)增加空格的數(shù)量,如:
$short = foo($bar);
$long_variable = foo($baz);
函數(shù)聲明(Function Declarations)
包含默認(rèn)值的參數(shù)應(yīng)當(dāng)放在最后,當(dāng)函數(shù)擁有返回值時(shí),盡量返回便于理解的值:
復(fù)制代碼 代碼如下:
function funstuff_system($field) {
$system["description"] = t("This module inserts funny text into posts randomly.");
return $system[$field];
}
類構(gòu)造器調(diào)用(Class Constructor Calls)
當(dāng)調(diào)用不帶參數(shù)的類構(gòu)造器時(shí),始終包含括號(hào)
$foo = new MyClassName();
帶參數(shù)的類構(gòu)造器
$foo = new MyClassName($arg1, $arg2);
如果使用變量做為類名,需先為變量賦值,然后才調(diào)用類構(gòu)造器:
復(fù)制代碼 代碼如下:
$bar = 'MyClassName';
$foo = new $bar();
$foo = new $bar($arg1, $arg2);
數(shù)組(Array)
數(shù)組的值之間應(yīng)使用空格分隔,賦值操作符號(hào)(=>)左右也應(yīng)包含空格:
$some_array = array('hello', 'world', 'foo' => 'bar');
當(dāng)聲明數(shù)組的字符長(zhǎng)度超過80個(gè)字符(通常在構(gòu)造表單和菜單時(shí)),應(yīng)該將各元素分行、縮進(jìn)編寫:
復(fù)制代碼 代碼如下:
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Title'),
'#size' => 60,
'#maxlength' => 128,
'#description' => t('The title of your node.'),
);
注意:最后一個(gè)數(shù)組元素末尾有一個(gè)逗號(hào),這并不是手誤,而是避免有新元素加入到最后之后因缺少逗號(hào)而出現(xiàn)解析錯(cuò)誤。(從某種程度上來(lái)講,在最后一個(gè)數(shù)組元素末尾加上逗號(hào)是一種推薦的做法,甚至在向drupal.org提交代碼時(shí),一些代碼規(guī)范檢測(cè)腳本會(huì)因?yàn)樽詈笠粋€(gè)元素沒有添加逗號(hào)而出現(xiàn)警告提示。)
引號(hào)(Quotes)
Drupal 對(duì)于單引號(hào)和雙引號(hào)的使用并沒有很強(qiáng)硬的標(biāo)準(zhǔn),只需在同一模塊內(nèi)保持用法的統(tǒng)一即可。
使用單引號(hào)的效率要高于雙引號(hào),因?yàn)榻馕銎鞑恍枰揭?hào)之間查找變量。以下是使用雙引號(hào)的兩種情況:
引號(hào)中間帶有變量,如"<h2>$header</h2>"
引號(hào)中間帶有單引號(hào),使用雙引號(hào)可避免對(duì)單引號(hào)的轉(zhuǎn)義 "He's a good person." 當(dāng)然也可以使用單引號(hào),但 .pot 解析器不能很好的處理這種情況,而且看起來(lái)怪怪的'He/'s a good person.'
字符串連接(String Concatenations)
在點(diǎn)與要連接字符串之間需要加入空格以加強(qiáng)代碼可讀性:
如果只是簡(jiǎn)單地連接變量,可以使用雙引號(hào)
使用連接賦值符(.=)時(shí),需要在符號(hào)兩側(cè)預(yù)留空格
注釋(Comment)
注釋規(guī)范單獨(dú)在 Doxygen及注釋格式規(guī)范頁(yè)面 討論
引入代碼(Including Code)
任何無(wú)條件引用文件的情況下,使用 require_once(), 任何有條件引用文件的情況,則使用 include_once(). 這兩條語(yǔ)句都會(huì)保證文件只被引入一次。
當(dāng)從當(dāng)前目錄或子目錄引入代碼時(shí),始終以點(diǎn)路徑開頭
include_once ./includes/mymodule_formatting.inc
在 Drupal 7 及更新版本中,使用 DRUPAL_ROOT 常量:
require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
php 代碼標(biāo)簽(php Code Tags)
始終使用<?php ?>來(lái)界定php代碼而不使用要<? ?>。這是為了遵循Drupal規(guī)范,同時(shí)也便于代碼在其它系統(tǒng)和平臺(tái)中被引用。
自 Drupal 4.7 開始,最后的 ?> 都故意被忽略不寫,原因如下:
移除它可以避免在文件末尾出現(xiàn)空白字符,這些空白字符可能導(dǎo)致“文件頭已發(fā)送(header already sent)”錯(cuò)誤,XHTML/XML驗(yàn)證錯(cuò)誤,及其它問題
php 官方說(shuō)明 結(jié)尾的php界定符是可選項(xiàng)
php.NET 自身也移除了文件末尾的界定符(如 prepend.inc )
分號(hào)(Semicolons)
php 語(yǔ)言要求除了代碼塊以外,大多數(shù)行尾都要跟上分號(hào)。Drupal 代碼規(guī)范同樣有此要求,并且對(duì)于代碼塊也是如此。以下是一個(gè)單行代碼塊的示例:
-- YES
-- NO
示例 URL(Example URL)
使用 example.com 表示所有示例 URLs
命名規(guī)范(Naming Conventions)
函數(shù)與變量(Functions and Variables)
函數(shù)與變量名稱應(yīng)該使用小寫字母,且單詞之間使用下劃線分隔。函數(shù)應(yīng)該使用模塊組/模塊名稱作為前綴,以避免與不同模塊間的沖突。
持久變量(Persistent Variables)
持久變量是指通過 variable_get()/variable_set() 函數(shù)取得和設(shè)置的變量,變量名稱應(yīng)該使用小寫字母,且單詞之間使用下劃線進(jìn)行分隔。持久變量也應(yīng)該使用模塊組/模塊名稱作為前綴,以避免與不同模塊間的沖突。
常量(Constants)
常量始終要求使用全大寫字母,且單詞之間使用下劃線進(jìn)行分隔。(包括php內(nèi)置常量 TRUE, FALSE, NULL)
模塊中定義的常量需始終使用大寫的模塊名稱作為前綴。
在 Drupal 8 及之后,應(yīng)使用 const 關(guān)鍵詞代替 define() 函數(shù)來(lái)定義常量,因?yàn)樾矢?BR>注意 const 不能用于php表達(dá)式,因此在條件判斷和非字面值(non-literal value ???)時(shí),還是應(yīng)當(dāng)使用 define() 函數(shù)
全局變量(Global Variables)
定義全局變量時(shí),應(yīng)當(dāng)使用下劃線加模塊/主題名稱開頭
類(Class)
類名應(yīng)使用駝峰式命名(即單詞首字母大寫)
類中的方法(函數(shù))和屬性(成員變量)應(yīng)使用首字母小寫的駝峰式
定義訪問權(quán)限時(shí),使用 protected 而代替 private,從而其它的類可以在必要時(shí)擴(kuò)展和更新方法。Protected 和 public 函數(shù)和變量不應(yīng)以下劃線開頭。
更多關(guān)于 面向?qū)ο蟮木幋a規(guī)范
文件名(Filename)
所有文檔文件都應(yīng)加上 .txt 后綴,以便于 Windows 用戶查看。同時(shí),所有文件名稱應(yīng)該全部大寫,而文件后綴應(yīng)該全部小寫。
如 README.txt, INSTALL.txt, TODO.txt, CHANGELOG.txt 等等。
輔助模塊及工具
Coder 模塊:可以遵循部分以上代碼規(guī)范,對(duì)代碼進(jìn)行審查及修改建議
Drupal Code Sniffer :代碼規(guī)范檢測(cè)工具
PAReview.sh :還處理沙盒中的代碼規(guī)范檢測(cè)腳本,幾乎嚴(yán)格遵守以上所有代碼規(guī)范并給出修改建議。
php技術(shù):PHP編碼規(guī)范的深入探討,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。