[LNMP]php編程建議規范

人都有自由的天性,所以規范是不受歡迎的,但當你被舊代碼或別人的代碼繞的云里霧里的時候,就會想要是有規范多好。所以規范最重要的作用是統一寫作風格,提高可讀性,當然這些規范不是某個人的規范,而是一些優秀的、已經達成共識的規則組成,例如大名鼎鼎的 Google Code Style,是google建議的編碼規范。PHP標準組也有一系列的風格建議,其中關于代碼風格的,即 PSR-0, PSR-1, PSR-2PSR-4。

說明


基于php 5.3 版本編寫

文件規范


  1. 文件編碼必須使用utf-8編碼;
  2. 文件后綴只使用 .php,不允許使用其他后綴;
  3. 文件或目錄的命名和引用必須是大小寫敏感,Gather.php 和 gather.php 是兩個不同的文件;
  4. 每個php文件只允許聲明或定義一個類,在類文件里面寫其它代碼是允許的,但不鼓勵;
  5. 接口類和抽象類必須獨立一個文件,接口類的命名以xxxxInterface.php,抽象類的命名以 xxxxAbstract.php;

編碼風格


  1. 強制縮進:代碼結構的層次通過縮進表達,1個縮進使用4個空格,如果使用Tab鍵進行縮進,先檢查IDE的Tab設置是否為4個空格;
  2. 顯式聲明變量權限:每個類屬性和方法 必須顯式聲明訪問的權限:public / protected / private;
  3. 變量不允許轉換類型:每個變量在定義的時候必須顯式聲明變量的類型,例如:$articleList = array(); ,并且在運行過程中,不允許對已聲明的變量變更類型。
    <pre>
    //局部變量初始化
    $articles = array();
    ...
    ...
    $articles = 'article';//雖然php允許,但不建議這樣用,可能增加未知風險
    ...
    ...
    </pre>
  4. 大括號的使用,允許兩種方式,但在一個系統里,保持使用其中一種方式:
    <pre>
    方式一:
    if(...){
    //code
    }else{
    //code
    }
    方式二:
    if(...)
    {
    //code
    }
    else
    {
    //code
    }
    </pre>

命名規范


以下命名規范包含文件名/類名/接口名/變量名/函數名
  1. 命名區分大小寫;
  2. 命名使用對應的英文進行拼寫,不使用拼音拼寫;
  3. 命名書寫采用駝峰式寫法(除常量外);
文件名、類名規范
  1. 文件名首字母大寫,并且只允許字母、數字組成;
  2. 類名與類文件名保持一致;
  3. 文件名和類名在程序中保持唯一;例如:GatherHandle.php 文件里面,定義了一個 GatherHandle 的類
變量名規范
  1. 除常量外,其他變量首字母小寫,變量名由字母、數字、下劃線組成;
  2. 全局變量,以小寫g開頭,例如:$gUserConfig;
  3. 靜態變量,以小寫s開頭,例如:$sNumCount;
  4. private 的類屬性,以下劃線開頭,例如:$_currentStringEncoding;
  5. protected、public 類屬性/局部變量,以小寫字母開頭,例如:$currentStringEncoding;
  6. 類中的常量 constant 和全局范圍內常量define,使用全大寫拼寫,由大寫字母、數字、下劃線組成,例如:UTF8_ENCODING;
函數名
  1. 函數名/方法名由字母、數字、下劃線組成;
  2. private 的類方法,以下劃線開頭,例如:function _getStringEncoding($string){ ... }
  3. protected、public 類方法/函數,以小寫字母開頭,例如:function getStringEncoding($string){ ... }

防御式編程


必須檢測數據是否符合預期類型

<pre>
$articleList = '';
...
...
foreach($articleList as $article){
...
}
//對變量進行隨意更改類型(雖然php允許)可能增加bug風險,良好習慣的重要性
</pre>

對外部數據注重合法性判斷

用戶輸入數據,例如:GET/POST 進來的數據,$_GET['pageId']
函數參數傳進來的數據,例如:function getStringEncoding($string){ ... }

  1. 首先確保數據的安全性(防止注入攻擊):
    a. 如果對于確定類型的(非文本),可以使用強制類型轉換,例如:$pageId = (isset($_GET['pageId']))?(int)$_GET['pageId']:1;
    b. 如果對于字符文本數據,則需要做xss過濾,建議使用:HTMLPurifier
  2. 其次判斷數據上下邊界有效性,例如:pageId 有效范圍是 1~5,那如果用戶輸入是 6,如果不處理,后面的代碼又依賴于這個數,可能導致不可預期的異常;
  3. 對于上傳的文件,需判斷格式、文件大小是否符合預定約束。
對過程數據注重數據邊界判斷

在遵循 “編碼風格:變量不允許轉換類型”這個原則下,是不會出現變量數據合法性問題,在過程數據中,注重的是數據的邊界:
<pre>
$articleList = array(1,2,3,4);
...
...

$articleIndex = $articleList[4]; //超過數組邊界,將報錯
</pre>

建議性規范


  1. 命名時候不建議使用過度縮寫,因為每個人理解差異,過度縮寫會導致難以閱讀;
  2. 當一個字符串是純文本組成的時候(即不含變量),以單引號 '...' 作為定界符。例如:$stringEncoding = 'UTF-8';
  3. 勿濫用 @ 做錯誤處理,出現異常時候會導致程序難以調試;

工具推薦


sublime的phpcs,提示語法和自動糾正語法錯誤,可以節省格式化的編碼時間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • 1、引言 數據庫設計過程中表、字段等的命名規范也算是設計規范的一部分,不過設計規范更多的是為了確保數據庫設計的合理...
    SnowflakeCloud閱讀 41,068評論 0 48
  • 一、php可以做什么 php是一種可以在服務器端運行的編程語言,可以運行在Web服務器端。 php是一門后臺編程語...
    空谷悠閱讀 3,133評論 4 97
  • 文章來自https://github.com/Blankj/AndroidStandardDevelop#安卓開發...
    小莊bb閱讀 773評論 0 1
  • Do not wait for the perfect moment,take the moment and ma...
    紫木蘇閱讀 211評論 0 2