人都有自由的天性,所以規范是不受歡迎的,但當你被舊代碼或別人的代碼繞的云里霧里的時候,就會想要是有規范多好。所以規范最重要的作用是統一寫作風格,提高可讀性,當然這些規范不是某個人的規范,而是一些優秀的、已經達成共識的規則組成,例如大名鼎鼎的 Google Code Style,是google建議的編碼規范。PHP標準組也有一系列的風格建議,其中關于代碼風格的,即 PSR-0, PSR-1, PSR-2 和 PSR-4。
說明
基于php 5.3 版本編寫
文件規范
- 文件編碼必須使用utf-8編碼;
- 文件后綴只使用 .php,不允許使用其他后綴;
- 文件或目錄的命名和引用必須是大小寫敏感,Gather.php 和 gather.php 是兩個不同的文件;
- 每個php文件只允許聲明或定義一個類,在類文件里面寫其它代碼是允許的,但不鼓勵;
- 接口類和抽象類必須獨立一個文件,接口類的命名以xxxxInterface.php,抽象類的命名以 xxxxAbstract.php;
編碼風格
- 強制縮進:代碼結構的層次通過縮進表達,1個縮進使用4個空格,如果使用Tab鍵進行縮進,先檢查IDE的Tab設置是否為4個空格;
- 顯式聲明變量權限:每個類屬性和方法 必須顯式聲明訪問的權限:public / protected / private;
-
變量不允許轉換類型:每個變量在定義的時候必須顯式聲明變量的類型,例如:$articleList = array(); ,并且在運行過程中,不允許對已聲明的變量變更類型。
<pre>
//局部變量初始化
$articles = array();
...
...
$articles = 'article';//雖然php允許,但不建議這樣用,可能增加未知風險
...
...
</pre> -
大括號的使用,允許兩種方式,但在一個系統里,保持使用其中一種方式:
<pre>
方式一:
if(...){
//code
}else{
//code
}
方式二:
if(...)
{
//code
}
else
{
//code
}
</pre>
命名規范
以下命名規范包含文件名/類名/接口名/變量名/函數名
- 命名區分大小寫;
- 命名使用對應的英文進行拼寫,不使用拼音拼寫;
- 命名書寫采用駝峰式寫法(除常量外);
文件名、類名規范
- 文件名首字母大寫,并且只允許字母、數字組成;
- 類名與類文件名保持一致;
- 文件名和類名在程序中保持唯一;例如:GatherHandle.php 文件里面,定義了一個 GatherHandle 的類
變量名規范
- 除常量外,其他變量首字母小寫,變量名由字母、數字、下劃線組成;
- 全局變量,以小寫g開頭,例如:$gUserConfig;
- 靜態變量,以小寫s開頭,例如:$sNumCount;
- private 的類屬性,以下劃線開頭,例如:$_currentStringEncoding;
- protected、public 類屬性/局部變量,以小寫字母開頭,例如:$currentStringEncoding;
- 類中的常量 constant 和全局范圍內常量define,使用全大寫拼寫,由大寫字母、數字、下劃線組成,例如:UTF8_ENCODING;
函數名
- 函數名/方法名由字母、數字、下劃線組成;
- private 的類方法,以下劃線開頭,例如:function _getStringEncoding($string){ ... }
- protected、public 類方法/函數,以小寫字母開頭,例如:function getStringEncoding($string){ ... }
防御式編程
必須檢測數據是否符合預期類型
<pre>
$articleList = '';
...
...
foreach($articleList as $article){
...
}
//對變量進行隨意更改類型(雖然php允許)可能增加bug風險,良好習慣的重要性
</pre>
- 常用函數包括:isset、empty、is_array、is_int、is_string...更多參考Variable handling
- 或使用filter_input、filter_var系列函數進行處理
對外部數據注重合法性判斷
用戶輸入數據,例如:GET/POST 進來的數據,$_GET['pageId']
函數參數傳進來的數據,例如:function getStringEncoding($string){ ... }
- 首先確保數據的安全性(防止注入攻擊):
a. 如果對于確定類型的(非文本),可以使用強制類型轉換,例如:$pageId = (isset($_GET['pageId']))?(int)$_GET['pageId']:1;
b. 如果對于字符文本數據,則需要做xss過濾,建議使用:HTMLPurifier - 其次判斷數據上下邊界有效性,例如:pageId 有效范圍是 1~5,那如果用戶輸入是 6,如果不處理,后面的代碼又依賴于這個數,可能導致不可預期的異常;
- 對于上傳的文件,需判斷格式、文件大小是否符合預定約束。
對過程數據注重數據邊界判斷
在遵循 “編碼風格:變量不允許轉換類型”這個原則下,是不會出現變量數據合法性問題,在過程數據中,注重的是數據的邊界:
<pre>
$articleList = array(1,2,3,4);
...
...
$articleIndex = $articleList[4]; //超過數組邊界,將報錯
</pre>
建議性規范
- 命名時候不建議使用過度縮寫,因為每個人理解差異,過度縮寫會導致難以閱讀;
- 當一個字符串是純文本組成的時候(即不含變量),以單引號 '...' 作為定界符。例如:$stringEncoding = 'UTF-8';
- 勿濫用 @ 做錯誤處理,出現異常時候會導致程序難以調試;
工具推薦
sublime的phpcs,提示語法和自動糾正語法錯誤,可以節省格式化的編碼時間。