PHP編碼規範的深入探討_PHP教程

來源:互聯網
上載者:User
縮排與空白字元(Indenting and Whitespace)
使用 2 個空格而不使用 tab 鍵進行代碼縮排(notepad++, Eclipse 等編輯器均支援此項配置);
行尾不應該有空白字元
應使用 \n (Unix分行符號),而不是 \r\n (Windows 分行符號)
所有檔案均應以一個空行結尾

運算子(Operators)
所有二元運算子(二個值之間的運算子),如 +, -, =, !=, ==, > 等等,在運算子兩端均需留有一個空格,如應該使用 $foo = $bar 而不是 $foo=$bar。
所有一元運算子(只操作一個值班的運算子),例如 ++,在值與運算子之間則不應加入空格

轉型(Casting)
在 (type) 與要轉型的變數之間應加入一個空格,如 (int) $mynumber.
控制結構(Control Structures)
控制結構包含 if, for, while, switch 等等,下面是一個簡單的 if 語句結構樣本:
複製代碼 代碼如下:
if (condition1 || condition2) {
action1;
}
elseif (condition3 && condition4) {
action2;
}
else {
defaultaction;
}

(Note: 不要使用 "else if" -- 總是使用 elseif.)
控制語句的關鍵詞與左邊括弧之間應該有一個空格,以此來與函數調用進行區分。
即使在大括弧是可選的情況下,也應當總是使用大括弧。這樣可以加強代碼的可讀性以及減少因嵌套帶來的邏輯錯誤。
switch 語句結構樣本:
複製代碼 代碼如下:
switch (condition) {
case 1:
action1;
break;
case 2:
action2;
break;
default:
defaultaction;
}
do-while 語句結構樣本:
do {
actions;
} while ($condition);

行長度與封裝(Line length and wrapping)
通常情況下,每行代碼的長度不應超過80個字元
以下情況,行長度可超過80個字元:當行內包含過長的函數名稱、函數/類定義、變數聲明等
為方便閱讀和理解,控制結構的行長度可超過80個字元
複製代碼 代碼如下:
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)不應該寫作多行
控制條件應該適當拆分以便於閱讀和理解,編寫代碼時要避免以下情形:
複製代碼 代碼如下:
// DON'T DO THIS!
if ((isset($key) && !empty($user->uid) && $key == $user->uid) || (isset($user-
>cache) ? $user->cache : '') == ip_address() || isset($value) && $value >= time()))
{
...
}

將控制條件進行拆分,不僅便於閱讀,同時也方便添加註釋讓人知道為何進行這樣的條件判斷
複製代碼 代碼如下:
// 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) {
...
}

函數調用(Function Calls)
調用函數時,函數名與左括弧之間沒有空格,除最後一個參數外,每個參數後的 , 都應跟上一個空格,如:
$var = foo($bar, $baz, $quux);
如之前所說,等號兩邊應該各有一個空格。當有一系列相關語句時,出於可讀性的考慮,可以適當增加空格的數量,如:
$short = foo($bar);
$long_variable = foo($baz);

函式宣告(Function Declarations)
包含預設值的參數應當放在最後,當函數擁有傳回值時,盡量返回便於理解的值:
複製代碼 代碼如下:
function funstuff_system($field) {
$system["description"] = t("This module inserts funny text into posts randomly.");
return $system[$field];
}

類構造器調用(Class Constructor Calls)
當調用不帶參數的類構造器時,始終包含括弧
$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('The title of your node.'),
);

注意:最後一個數組元素末尾有一個逗號,這並不是手誤,而是避免有新元素加入到最後之後因缺少逗號而出現解析錯誤。(從某種程度上來講,在最後一個數組元素末尾加上逗號是一種推薦的做法,甚至在向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.htmlTechArticle縮排與空白字元(Indenting and Whitespace) 使用 2 個空格而不使用 tab 鍵進行代碼縮排(notepad++, Eclipse 等編輯器均支援此項配置); 行尾不應該...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.