草案 0.0.1
一。Zend Framework規範以下文為主:
Zend Framework 編碼規範
http://bbs.phpchina.com/viewthread.php?tid=142789
二。常規規範
1.變數命名與類的命名
(1) 類型 + 變數名: $inum
基於PHP語言弱類型的特點,以匈牙利命名法為參考,但國人不習慣大寫字母,所以純小寫,為基本規範。
一個類型字元+命名的方式,比如 $susername
s代表字串,i代表整型,a代表數組,o代表對象, r代表資源, b布爾型, d日期,例子:
$inum = 55;
$itotal = 110;
$susername = 'root';
$spassword = '123456';
$rlink = mysql_connect('localhost', 'root', '123456');
$odb = new dbstuff();
$anumber = array(1, 2, 3, 4, 5);
$ddate = '2010-06-04';
特殊常用的少數變數,可以不用書寫首碼,比如:
$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) 類名
類名在使用中經常遇到命名空間的問題,因此,類名的命名規範除了要遵循普通命名規則以外,還需在類名前附加產品和所屬模組名稱。
該名稱最好與表名首碼一致。如:
例如:
class cdb_trade_cart {
……
}
(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關鍵字後沒有空格,而小括弧的條件之後有空格,比如
if($inum == 55) {
……
}
(2) 斷行,如果語句過長(預設為80字元)時,需要斷行譬如:
array(
'a' => '這是一個字串',
'b' => '這是第二個字串',
'c' => '這是第三個字串'
)
複製代碼
(3) 縮排
以4個空格為一個縮排單位為準。
兩種方案:
A. 統一用Tab鍵,在代碼書寫完發布前,用編輯器功能統一替換為4個空格
B. 手動敲4個空格,或者編輯器功能自訂
(4) 大括弧與小括弧
大括弧的兩種方案:
A.
if() {
……
} elseif() {
……
} elseif() {
……
} else {
……
}
B.
if()
{
……
}
elseif()
{
……
}
else
{
……
}
小括弧,在運算子優先順序容易產生混淆的地方,必須用小括弧括起來,在變數拼接時,如果出現某個變數值作為字串的一部分,或者模板中複雜嵌套,要用大括弧{}括起來。
如 $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" />
那麼,在代碼中通過
$pssubmit = $_POST['registersubmit'];
if(empty($pssubmit)) {
//表現層代碼
} else {
//邏輯層代碼
}
B. 邏輯層可通過表現層的輸入表單元素的name 值來區隔開增刪查改。
如<input type="text" name="gender[]" value="" />,則判斷數組$pagender是否有值來變更操作
<input type="checkbox" name="delete[]" value="" />, 則判斷數組$padelete是否有值來進行刪除操作
……
(4) 迴圈體
A. 在迴圈體內,不允許出現重複計算。
如:
$sstring = 'abcdef';
//低效率的寫法
foreach($i = 0; $i < strlen($sstring); $i++) {
……
}
//高效寫法應該是:
$ilength = strlen($sstring);
foreach($i = 0; $i < $ilength; $i++) {
……
}
B. 在函數迴圈體內實現接收參數可以是單值,也可以是數組。如(參考discuz):
function decho($input) {
if(is_array($input)) {
foreach($input as $v) {
decho($v);
}
} else {
echo $input;
}
}
C. 盡量減少迴圈次數,如以下例子:
function neworder($aarray) {
sort($aarray);
$inum = count($aarray);
$iloop = round($inum / 2);
for($i = $inum; $i > $iloop; $i--){
$anewarray[] = $aarray[$i - 1];
$anewarray[] = $aarray[$inum - $i];
}
if($inum % 2 <> 0) {
$anewarray[] = $array[floor($inum / 2)];
}