編碼規范
一. 基本約定
1、源文件
(1)、純PHP代碼源文件只使用 <?php 標簽,省略關閉標簽 ?> ;
(2)、源文件中PHP代碼的編碼格式必須是無BOM的UTF-8格式;
(3)、使用Unix LF(換行符)作為行結束符;
(4)、一個源文件只做一種類型的聲明,即,這個文件專門用來聲明Class, 那個文件專門用來設置配置信息,別混在一起寫;(如class和interface不能混寫在一個源文件中)
2、縮進
使用Tab鍵來縮進,每個Tab鍵長度設置為4個空格,並且不得使用制表符進行縮進;(PhpStorm快捷鍵Ctrl+Alt+L);
3、行
一行推薦的是最多寫120個字符,多於這個字符就應該換行了,一般的編輯器是可以設置的;在非空白行的末尾不得有尾隨空格;可以添加空行以提高可讀性並指示相關的代碼塊;每行不得超過一個語句;
4、關鍵字 和 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'
5、命名
(1)、類名 使用大駝峰式(StudlyCaps)寫法;
(2)、(類的)方法名 使用小駝峰(cameCase)寫法;
(3)、函數名使用 小寫字母 + 下划線 寫法,如 function http_send_post();
(4)、變量名 使用小駝峰寫法,如 $userName;
6、代碼注釋標簽
如 函數注釋、變量注釋等,常用標簽有 @package、@var、@param、@return...必須遵守 phpDocument 標簽規則,不要另外去創造新的標簽,
7、業務模塊
(1)、涉及到多個數據表 更新/添加 操作時,最外層要用事務,保證數據庫操作的原子性;
(2)、Model層,只做簡單的數據表的查詢;
(3)、業務邏輯統一封裝到 Logic(邏輯)層;
(4)、控制器只做URL路由,不要當作 業務方法 調用;
(5)、控制器層不能出現SQL操作語句,如 ThinkPHP框架的 where()、order() 等模型方法,
即,控制器中,不要出現類似這樣的SQL語句:D('XXX')->where()->order()->limit()->find();
where()、order()、limit() 等SQL方法只能出現在 Model層、業務層!
二、代碼樣式風格
1、命名空間(Namespace) 和 導入(Use)聲明
(1)命名空間(namespace)的聲明后面必須有一行空行;
(2)所有的導入(use)聲明必須放在命名空間(namespace)聲明的下面;
(3)一句聲明中,必須只有一個導入(use)關鍵字;
(4)在導入(use)聲明代碼塊后面必須有一行空行;
2、類(class),屬性(property)和方法(method)
(1)、繼承(extends) 和實現(implement) 必須和類名寫在一行。
(2)、打開類的大括號必須在下一行,並且關閉括號必須
在主體之后的下一行;
(3)、打開方法的括號必須在下一行,並且關閉括號必須
在主體后面的下一行;
(4)、必須在所有屬性和方法上聲明可見性; abstract並且
final必須在能見度之前宣布; static必須在能見度后宣布;方法中如果有多個參數,第一個參數后緊接“,” ,再加一個空格(即在參數列表中,每個逗號前不得有空格,每個逗號后必須有一個空。),如果參數有默認值,“=”左右各有一個空格分開(具有默認值的方法參數必須位於參數
列表的末尾)。
(5)方法名稱不得在方法名稱后面用空格聲明。在括弧必須繼續自己的路線,和右括號必須繼續下去了下一行后的身體。在左括號后面不能有空格,並且在右括號之前不能有空格。
(6)當用到抽象(abstract)和終結(final)來做類聲明時,它們必須放在可見性聲明 (public 還是protected還是private)的前面。而當用到靜態(static)來做類聲明時,則必須放在可見性聲明的后面。
(7)在進行方法或函數調用時,方法或函數名稱與左括號之間不能有空格,在左括號后面不能有空格,並且在右括號之前不能有空格。在參數列表中,每個逗號前不得有空格,每個逗號后必須有一個空格。
參考1:
1 2 3 4 5 6 7 8 |
<?php namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB { // 寫一行 public getInfo($name, $age, $gender = 1) { // 參數之間有一個空格。默認參數的“=”左右各有一個空格,) 與 { 之間有一個空格
} } |
參考2:
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace Vendor\Package;
abstract class ClassName { protected static $foo; // static放后面 abstract protected function zim(); // abstract放前面
final public static function bar() { // final放前面,static放最后。 // 方法主體部分 } } |
參考3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php namespace library\Model;
use library\Helper\ImageHelper; use library\Logic\UserMainLogic;
/** * 用戶表 數據模型 * * @package library\Model */ class UserMainModel extends BasicModel { /** * 獲得用戶統計信息 * * @param int $userId 用戶ID * @return array */ public function getUserCard($userId) { $userId = intval($userId); return UserMainLogic::instance()->getUserCard($userId); }
/** * 根據Id 獲取用戶信息 * * @param int $userId 用戶Id * @param string $field 顯示字段 * @return array */ public function getByUserId($userId = 0, $field = '*') { if (empty($userId)) { return array(); }
$where = array('id' => $userId); $info = $this->field($field)->where($where)->find();
if (isset($info['image']) && isset($info['sex'])) { $info['image'] = ImageHelper::GetImageUrl($info['image'], $info['sex']); }
return $info; } } |
3、控制結構
控制接口,就是 if else while switch等。這一類的寫法規范也是經常容易出現問題的,也要規范一下。
(1)、if,elseif,else寫法,直接上規范代碼吧:
1 2 3 4 5 6 7 8 |
<?php if ($expr1) { // if 與 ( 之間有一個空格,) 與 { 之間有一個空格
} elseif ($expr2) { // elesif 連着寫,與 ( 之間有一個空格,) 與 { 之間有一個空格
} else { // else 左右各一個空格
} |
(2)、switch,case 注意空格和換行,還是直接上規范代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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 的寫法也是類似,上代碼:
1 2 3 4 5 6 7 8 |
<?php while ($expr) { // while 與 ( 之間有一個空格, ) 與 { 之間有一個空格
}
do { // do 與 { 之間有一個空格
} while ($expr); // while 左右各有一個空格 |
(4)、for的寫法
1 2 3 4 |
<?php for ($i = 0; $i < 10; $i++) { // for 與 ( 之間有一個空格,二元操作符 "="、"<" 左右各有一個空格,) 與 { 之間有一個空格
} |
(5)、foreach的寫法
1 2 3 4 |
<?php foreach ($iterable as $key => $value) { // foreach 與 ( 之間有一個空格,"=>" 左右各有一個空格,) 與 { 之間有一個空格
} |
(6)、try catch的寫法
1 2 3 4 5 6 7 8 |
<?php try { // try 右邊有一個空格
} catch (FirstExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格
} catch (OtherExceptionType $e) { // catch 與 ( 之間有一個空格,) 與 { 之間有一個空格
} |
4、注釋
(1)、行注釋
單行注釋應該和代碼合在一起;// 后面需要加一個空格;
如果 // 前面有非空字符,則 // 前面需要加一個空格;
大塊的注釋和代碼之間應該留一個空行。大的代碼塊之間也應該留空行,形成代碼段落。
(2)、函數注釋
參數名、屬性名、標簽的文本 上下要對齊;
在第一個標簽前加一個空行;
5、空格
(1)、賦值操作符(=,+= 等)、邏輯操作符(&&,||)、等號操作符(==,!=)、關系運算符(<,>,<=,>=)、按位操作符(&,|,^)、連接符(.) 左右各有一個空格;
(2)、if,else,elseif,while,do,switch,for,foreach,try,catch,finally 等 與 緊挨的左括號“(”之間有一個空格;
(3)、函數、方法的各個參數之間,逗號(",")后面有一個空格;
6、數組 的書寫格式
只有一個鍵值對時,就寫成一行:
1 |
$where = array('id' => 789); |
有多個(二個或二個以上)鍵值對時,就換行:
1 2 3 4 |
$where = array( 'id' => 789, 'user_name' => '52php' ); |
所有左花括號 { 都不換行,並且 { 緊挨着的下方,一定不是空行!