PHP代碼規範(一)

1.變量命名與類的命名
(1) 類型 + 變量名: $inum
基於PHP語言弱類型的特色,以匈牙利命名法爲參考,但國人不習慣大寫字母,因此純小寫,爲基本規範。
一個類型字符+命名的方式,好比 $susername
s表明字符串,i表明整型,a表明數組,o表明對象, r表明資源, b布爾型, d日期,例子:
php

  1. $inum = 55;
    mysql

  2. $itotal = 110;
    程序員

  3. $susername = 'root';
    sql

  4. $spassword = '123456';
    數據庫

  5. $rlink = mysql_connect('localhost', 'root', '123456');
    數組

  6. $odb = new dbstuff();
    緩存

  7. $anumber = array(1, 2, 3, 4, 5);
    服務器

  8. $ddate = '2010-06-04';iview



特殊經常使用的少數變量,能夠不用書寫前綴,好比:
$uid, $sid, $sql, $row, $db, $i, $j, $k, $v或者$key, $value


這種書寫方式缺點:略需一點適應成本,但習慣後對程序員的類型思惟有幫助,對團隊開發和代碼閱讀調試意義重大。

(2) 經常使用的命名及數據庫設計字段類型及長度字符串類型通常沒有默認值,而非主鍵的數值類型,非空,默認值爲0。
username 用戶名, char(16) 
password 密碼, char(32)
email 郵件, char(50)
dateline 時間,int(10)
register 註冊
login 登錄
adminid 管理員id, 某某id的命名,採用 名字+id的方式,

好比groupid, 
經常使用的id可用縮寫替代:好比
uid 用戶id, mediumint(8)
sid SESSION id
displayorder 文章或類別現實順序 smallint(6), -2爲未審覈, -1 忽略, 0以上爲正常順序。
基本規範摘取了Discuz設計數據庫的用法,效率是有目共睹的。


(3) 表示總數的命名,請用複數形式,如:

$iviews 總瀏覽數
$ireplies總回覆數
$iclicks總點擊數

(4) 表示權限判斷的命名,請在前面附加allow,如

$ballowview
$ballowpost
$ballowvisit

(5) 常規變量定義通常不使用下劃線_,中劃線- 和大寫字母,特殊字符等。



(6) 類名
類名在使用中常常遇到命名空間的問題,所以,類名的命名規範除了要遵循普通命名規則之外,還需在類名前附加產品和所屬模塊名稱。
該名稱最好與表名前綴一致。如:
例如:
數據庫設計

  1. class cdb_trade_cart {

  2.     ……

  3. }



(7) 字段名採用匈牙利命名法的好處:
程序中出現SQL語句時,陌生字段基本不用去查看錶結構。


如:
susername,
spassword,
idateline


2. 書寫細節規範

(1) 空格:
A. 等號或其餘運算符兩邊各有一個空格,好比 
$inum = 55;
$inum = 55 + 66;
B. 並列的各項中間用逗號分隔,其後要有一個空格。如:
array(1, 2, 3)而非array(1,2,3)
C. if語句中,if關鍵字後沒有空格,而小括號的條件以後有空格,好比

  1. if($inum == 55) {

  2.     ……

  3. }


(2) 斷行,若是語句過長(默認爲80字符)時,須要斷行譬如:

  1. array(

  2.   'a' => '這是一個字符串',

  3.   'b' => '這是第二個字符串',

  4.   'c' => '這是第三個字符串'

  5. )



(3) 縮進
以4個空格爲一個縮進單位爲準。
兩種方案:
A. 統一用Tab鍵,在代碼書寫完發佈前,用編輯器功能統一替換爲4個空格
B. 手動敲4個空格,或者編輯器功能自定義

(4) 大括號與小括號

大括號的兩種方案:
A.

  1. if() {

  2.     ……

  3. } elseif() {

  4.     ……

  5. } elseif() {

  6.     ……

  7. } else {

  8.     ……

  9. }


B.

  1. if() 

  2. {

  3.     ……

  4. }

  5. elseif() 

  6. {

  7.     ……

  8. }

  9. else 

  10. {

  11.     ……

  12. }



小括號,在運算符優先級容易產生混淆的地方,必須用小括號括起來,在變量拼接時,若是出現某個變量值做爲字符串的一部分,或者模板中複雜嵌套,要用大括號{}括起來。
如 $sql = "SELECT uid FROM {$tablepre}members";
或 模板中:{$aarray[$key][sec]}

(5) 單引號,雙引號與SQL

儘可能使用單引號,好比
$susername = 'root';
在寫數組的索引時,必須使用單引號:
如 $alist['key']的方式,而不是$alist[key]。

單雙引號的嵌套組合,SQL語句(關鍵字需大寫)拼接的推薦寫法。字段名可以使用``號區隔。
A. $sql = "SELECT `uid` FROM {$tablepre}members WHERE `username` = '$gsusername' LIMIT 1";
外層是雙引號,因此裏面在單引號內的變量可以解析。
單引號代表裏面的值是個字符串。
這樣的拼接方式好處在於易讀性。
B. $sql = 'SELECT `uid` FROM '.$tablepre.'members WHERE `username` = \''.$gsusername.'\' LIMIT 1';
這樣書寫的好處是效率會高點,可是語句比較不易讀,須要轉義字符,稍微繁複。

其餘經常使用拼接:
HTML時,$sform = '<input type="text" name="username" />';
3. 程序語句段書寫規範

(1) 先按前後依賴關係分順序,再按功能分隔語句段。
如關於 $sid 有50行語句段A,前面依賴通用功能定義。
那麼通用功能定義語句應在A段代碼以前。
A段代碼,和其餘功能段代碼,都應該成塊狀。

好比500行文件,可分爲段A、B、C、D、E等。
各段之間用兩個空行區隔開

(2) 功能段內部語句段順序

A. 變量賦初值
B. 肯定主要功能邏輯段所用到的變量值
C. 主功能邏輯段
D. 返回、輸出或其餘操做

(3) 後臺管理功能塊或其餘功能塊的基本劃分:

A. 用表單的提交元素判斷切分開邏輯層與表現層
如 <input type="submit" name="registersubmit" />
那麼,在代碼中經過

  1. $pssubmit = $_POST['registersubmit'];

  2. if(empty($pssubmit)) {

  3.     //表現層代碼

  4. } else {

  5.     //邏輯層代碼

  6. }


B. 邏輯層可經過表現層的輸入表單元素的name 值來區隔開增刪查改。
如<input type="text" name="gender[]" value="" />,則判斷數組$pagender是否有值來進行更改操做
<input type="checkbox" name="delete[]" value="" />, 則判斷數組$padelete是否有值來進行刪除操做
……
(4) 循環體

A. 在循環體內,不容許出現重複計算。
如:


  1. $sstring = 'abcdef';

  2. //低效率的寫法

  3. foreach($i = 0; $i < strlen($sstring); $i++) {

  4.     ……

  5. }

  6. //高效寫法應該是:

  7. $ilength = strlen($sstring);

  8. foreach($i = 0; $i < $ilength; $i++) {

  9.     ……

  10. }



B. 在函數循環體內實現接收參數能夠是單值,也能夠是數組。如(參考discuz):

  1. function decho($input) {

  2.     if(is_array($input)) {

  3.         foreach($input as $v) {

  4.             decho($v);

  5.         }    

  6.      } else { 

  7.        echo $input;

  8.      }

  9. }



C. 儘可能減小循環次數,如如下例子:


  1. function neworder($aarray) {

  2.     sort($aarray);

  3.     $inum = count($aarray);

  4.     $iloop = round($inum / 2);

  5.     for($i = $inum; $i > $iloop; $i--){

  6.         $anewarray[] = $aarray[$i - 1];

  7.         $anewarray[] = $aarray[$inum - $i];

  8.     }

  9.     if($inum % 2 <> 0) {

  10.         $anewarray[] = $array[floor($inum / 2)];

  11.     }

  12.     print_r($anewarray);

  13.     $array = $anewarray;

  14. }

  15. $aarray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);

  16.  

  17. neworder($aarray);


4。使用建議:(1) 程序根目錄定義
基本思路以程序中必然包含的公用文件爲基準,好比include目錄下的common.inc.php
define('ROOT', substr(dirname(__FILE__), 0, -7));

每一個入口腳本必須在開頭包含此行語句,(-7爲你公用包含文件所在目錄名長度)

(2) require_once和include_once
基本不使用 include或require, 統一使用require_once和include_once
如非臨時文件包含,則必須使用require_once,不然使用include_once如緩存文件,模板編譯文件等。
爲區別開,require_once 和 include_once 不加小括號。寫法以下:

require_once ROOT . './include/xxxx.php';


路徑書寫前,必須加'./',必須使用/,而不使用\。


(3) 流程建議

A. 使用如下方式來控制開關。


if(in_array($smodel, array('cms', 'bbs', 'sns'))) {
    ……
}


B. 邏輯分支控制
純數字或者固定值返回的控制用switch ... case


邏輯分支判斷條件比較複雜時,使用 if ... else


邏輯分支結構都以函數爲分割的,可採用以下方式:


function a() {


}
function b() {


}


//下面的值,能夠是任意傳參。這樣效率分支開銷效率比較高。
$scase = 'a';


$scase();

5. 文件目錄命名

(1) 空目錄索引
除主目錄之外的全部目錄放置一個1字節的index.htm來防止服務器目錄列表打開時,服務器動態文件腳本被下載。
(2) 經常使用的目錄

config文件夾,經常使用配置文件
template 模板文件夾
下面有default文件夾,表示程序默認模板
language 語言包文件夾
admin 後臺管理目錄
include/source 文件夾,主要函數包含文件
image 圖片文件夾
js Javascript文件夾
API應用程序接口
install安裝目錄

data 生成文件的臨時文件夾,下有幾個目錄:
        cache文件緩存
        log 日誌文件
        template 模板編譯文件緩存
        ……


(3) 文件名,小寫字母+下劃線

擴展名:php文件用.php,模板文件使用.htm,JavaScript

文件使用.js
A.function_xxxx.php 表示函數包含文件
B.class_xxxx.php 表示類文件
C.不帶下劃線的字母文件名,表示功能主入口文件。
好比 index.php
D.某功能模塊下,子功能文件名定義:
模塊名_子功能.php, 
如:member_register.php表示用戶模塊的註冊功能文件。
language_friend.php表示朋友模塊的語言包。

(4)PHP文件格式

        編碼:應用平臺核心文件使用utf-8無BOM頭,避免不一樣編碼形成的亂碼(切忌使用記事本)。        

        標記:PHP文件必須使用 <?php,文件結尾不加?>,以防止空行帶來的邏輯問題。        


        行分割:使用 \n 換行符,不可以使用 \r\n 或 \r。

6. 註釋


有如下幾種註釋
A. 文檔頭部說明註釋格式

  1. /***

  2. *  這是註釋

  3. *  是註釋

  4. *  註釋

  5. */


B. 單行註釋,必須如今所註釋的前一行或簡短寫在行末



  1. //這是註釋,下面是變量賦值的例子

  2. $inum = 55;

  3.  

  4. $inum = 55; //行末註釋



C. 多行註釋

  1. /*

  2.   這是註釋

  3. */



D. 儘可能不用 #、///等方式進行註釋,
E. 代碼書寫完之後,冗餘調試代碼的註釋必須刪除掉,只剩簡潔的代碼功能描述註釋

我但願定一個開放性的規則,你們參與進來,並修訂他

7. 代碼提交

全部代碼提交必須使用SVN或CVS等版本維護功能提交,不得使用FTP直接上傳。
SVN同步,能夠採用遠程共享同一臺機子的數據庫。
或者同步data目錄
也可遵循統一的命名,如統一的數據名、表名、域名、字段名、用戶名、密碼等。
而後基本數據庫各本地拷貝一份。

相關文章
相關標籤/搜索