### 基本約定
* 源文件
1. 純PHP代碼源文件只使用 <?php 標簽,省略關閉標簽 ?> ;
2. 源文件中PHP代碼的編碼格式必須是無BOM的UTF-8格式;
3. 使用 Unix LF(換行符)作為行結束符;
4. 一個源文件只做一種類型的聲明,即,這個文件專門用來聲明Class, 那個文件專門用來設置配置信息,別混在一起寫;
5. 縮進,使用Tab鍵來縮進,每個Tab鍵長度設置為4個空格;
6. 行,一行推薦的是最多寫120個字符,多于這個字符就應該換行了,一般的編輯器是可以設置的。
7. 關鍵字 和 True/False/Null,PHP的關鍵字,必須小寫,boolean值:true,false,null 也必須小寫。
下面是PHP的“關鍵字”,必須小寫:`__halt_compiler`, `abstract`, `and`, `array`, `as`, `break`, `callable`, `case`, `catch`, `class`, `clone`, `const`, `continue`, `declare`, `default`, `die`, `do`, `echo`, `else`, `elseif`, `empty`, `enddeclare`, `endfor`, `endforeach`, `endif`, `endswitch`, `endwhile`, `eval`, `exit`, `extends`, `final`, `for`, `foreach`, `function`, `global`, `goto`, `if`, `implements`, `include`, `include_once`, `instanceof`, `insteadof`, `interface`, `isset`, `list`, `namespace`, `new`, `or`, `print`, `private`, `protected`, `public`, `require`, `require_once`, `return`, `static`, `switch`, `throw`, `trait`, `try`, `unset`, `use`, `var`, `while`, `xor`
8. 類名使用大駝峰式(StudlyCaps)寫法;
9. (類的)方法名 使用小駝峰(cameCase)寫法;
10. 函數名使用 小寫字母 + 下劃線 寫法,如 function http_send_post();
11. 變量名 使用小駝峰寫法,如 $userName;
12. 代碼注釋標簽如 函數注釋、變量注釋等,常用標簽有 @package、@var、@param、@return、@author、@todo、@throws 必須遵守 phpDocument 標簽規則,不要另外去創造新的標簽,更多標簽查看 phpDocument官網
13. 涉及到多個數據表 更新/添加 操作時,最外層要用事務,保證數據庫操作的原子性;
14. Model層,只做簡單的數據表的查詢;
15. 控制器只做URL路由,不要當作 業務方法 調用;
16. 控制器層不能出現SQL操作語句,如 ThinkPHP框架的 where()、order() 等模型方法,即,控制器中,不要出現類似這樣的SQL語句:`D('XXX')->where()->order()->limit()->find();` `where()`、`order()`、`limit()` 等SQL方法只能出現在 Model層、業務層!
### 代碼樣式風格
1. 命名空間(Namespace) 和 導入(Use)聲明
2. 命名空間(namespace)的聲明后面必須有一行空行;
3. 所有的導入(use)聲明必須放在命名空間(namespace)聲明的下面;
4. 一句聲明中,必須只有一個導入(use)關鍵字;
5. 在導入(use)聲明代碼塊后面必須有一行空行;
### 類(class),屬性(property)和方法(method)
1. 繼承(extends) 和實現(implement) 必須和 class name 寫在一行。
2. 屬性(property)必須聲明其可見性,到底是 public 還是 protected 還是 private,不能省略,也不能使用var, var是php老版本中的什么方式,等用于public。
3. 方法(method),必須 聲明其可見性,到底是 public 還是 protected 還是 private,不能省略。如果有多個參數,第一個參數后緊接“,” ,再加一個空格:function_name ($par, $par2, $pa3), 如果參數有默認值,“=”左右各有一個空格分開。
4. 當用到抽象(abstract)和終結(final)來做類聲明時,它們必須放在可見性聲明 (public 還是protected還是private)的前面。而當用到靜態(static)來做類聲明時,則必須放在可見性聲明的后面。
### 控制結構
1. 控制接口,就是 if else while switch等。這一類的寫法規范也是經常容易出現問題的,也要規范一下。
<?php
if ($expr1) { // if 與 ( 之間有一個空格,) 與 { 之間有一個空格
} elseif ($expr2) { // elesif 連著寫,與 ( 之間有一個空格,) 與 { 之間有一個空格
} else { // else 左右各一個空格
}
2. switch,case 注意空格和換行,還是直接上規范代碼:
<?php
switch ($expr) { // switch 與 ( 之間有一個空格,) 與 { 之間有一個空格
case 0:
echo 'First case, with a break'; // 對齊
break; // 換行寫break,也對齊。
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
3. while,do while 的寫法也是類似,上代碼:
<?php
while ($expr) { // while 與 ( 之間有一個空格, ) 與 { 之間有一個空格
}
do { // do 與 { 之間有一個空格
} while ($expr); // while 左右各有一個空格
4. for的寫法
<?php
for ($i = 0; $i < 10; $i++) { // for 與 ( 之間有一個空格,二元操作符 "="、"<" 左右各有一個空格,) 與 { 之間有一個空格
}
5. foreach的寫法
<?php
foreach ($iterable as $key => $value) { // foreach 與 ( 之間有一個空格,"=>" 左右各有一個空格,) 與 { 之間有一個空格
}
6. try catch的寫法
<?php
try { // try 右邊有一個空格
} catch (FirstExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格
} catch (OtherExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格
}
### 注釋
1. 行注釋// 后面需要加一個空格;如果 // 前面有非空字符,則 // 前面需要加一個空格;
2. 函數注釋參數名、屬性名、標簽的文本 上下要對齊;在第一個標簽前加一個空行;
### 空格
1. 賦值操作符(=,+= 等)、邏輯操作符(&&,||)、等號操作符(==,!=)、關系運算符(<,>,<=,>=)、按位操作符(&,|,^)、連接符(.) 左右各有一個空格;
2. if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等 與 緊挨的左括號“(”之間有一個空格;
3. 函數、方法的各個參數之間,逗號(",")后面有一個空格;
### 空行
1. 所有左花括號 { 都不換行,并且 { 緊挨著的下方,一定不是空行;
2. 同級代碼(縮進相同)的 注釋(行注釋/塊注釋)前面,必須有一個空行;
3. 各個方法/函數 之間有一個空行;
4. namespace語句、use語句、clase語句 之間有一個空行;
5. return語句,如果 return 語句之前只有一行PHP代碼,return 語句之前不需要空行;如果 return 語句之前有至少二行PHP代碼,return 語句之前加一個空行;
6. if,while,switch,for,foreach、try 等代碼塊之間 以及 與其他代碼之間有一個空行;