## 一、規范前言篇
標準化不是特殊的個人風格,它讓程序員可以了解任何代碼,弄清程序的狀況;新人可以很快的適應環境;防止新接觸php的人一次次的犯同樣的錯誤;在一致的開發環境下,可以減少人們犯錯的機會。
## 二、命名定義篇
**函數變量命名**
使用英文名詞、動詞,以下劃線作為單詞的分隔,其他的字母均使用小寫,單詞的首個字母使用小寫,例:
~~~
$repeat_count = '';
$del_user_sql = '';
~~~
**類屬性命名**
使用英文名詞、動詞,以大寫字母作為單詞的分隔,其他的字母均使用小寫,單詞的首個字母使用小寫,不使用下劃線,不可缺省屬性描述符例如:`public、protect、private`
~~~
/**
* 服務端信息
* @var array
*/
protected $server = [];
/**
* 數據庫配置
* @var array
*/
public $dbConfig = [];
/**
* 路由配置
* @var array
*/
static public $route = [];
~~~
**全局常量命名**
使用英文名詞、動詞,所有字母都使用大寫,以下劃線分隔每個單詞,例:
~~~
define( 'WEBSITE_NAME', '名稱' );
define( 'WEBSITE_URL', '地址' );
~~~
**全局變量命名**
使用英文名詞、動詞,所有字母都截取首字母并且為大寫,首個字符以下劃線分割且以下劃線分隔每個單詞,例:
~~~
$_OG = [];
$_OGDB = [];
~~~
**數組變量命名**
使用英文名詞、動詞,以下劃線作為單詞的分隔,單詞的首個字母使用小寫,以字符串Array為后綴,例:
~~~
$scope_array = array();
$bookId_array = array();
~~~
**對象變量命名**
使用英文名詞、動詞,以大寫字母作為單詞的分隔且在后面加上對象的擴展后綴,其他的字母均使用小寫,單詞的首個字母使用大寫,不使用下劃線,例:
~~~
$userModel = new UserModel()
$wechatTool = new WechatTool();
~~~
**靜態方法編寫規范**
* 靜態公共方法的命名以下劃線作為每個單詞的分割符。
* 在公共全局方法中為了避免方法重新定義請加上`function_exists`的判斷。
* 每個方法需要寫明注釋并且參考以下格式。
~~~
if(!function_exists('input')) {
/**
* 獲取請求參數,類似于tp
* @access protected
* @param string|false $name 變量名
* @param mixed $default 默認值
* @return mixed
*/
function input($name = '', $default = null)
{
global $_GPC;
if (empty($_GPC)) {
$_GPC = array_merge($_GET,$_POST,$_COOKIE);
}
return isset($_GPC[$name]) ? $_GPC[$name] : $default;
}
}
~~~
**類編寫規范**
* 目錄使用小寫+下劃線;
* 類庫、函數文件統一以`.php`為后綴;
* 類的文件名均以命名空間定義,并且命名空間的路徑和類庫文件所在路徑一致;
* 類文件采用駝峰法命名(首字母大寫),其它文件采用小寫+下劃線命名;
* **類名和類文件名保持一致**,統一采用駝峰法命名(首字母大寫);
~~~
// +----------------------------------------------------------------------
// | onegow [ WE CAN DO IT MORE SIMPLE]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2018 http://onegow.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: MeYe Email:55585190@qq.com
// +----------------------------------------------------------------------
defined('IN_IA') or exit('Access Denied');
class User extends Base
{
/**
* 用戶信息
* @var array
*/
protected $user = [];
/**
* 用戶中心首頁
*/
public function index()
{
$this->assign('user',$this->user);
return $this->view();
}
}
~~~
## 三、語法書寫篇
**大括號{}規則**
將大括號左邊放在和判斷語句同一列且多一個空格,右邊則放在下方和左邊對齊,例:
~~~
if ( $condition ) {
...
}
~~~
**代碼縮進規則**
使用制表符縮進(TAB鍵)或四個空格。如果縮進層數大于四的時候,請重新設計該項業務邏輯的算法。
**小括號()規則**
不要把小括號和關鍵詞、方法名、方法參數緊貼在一起,要用一個空格分隔,例:
~~~
if ( $condition ) {
...
}
function addAccount( $inputDataArray ) {
...
}
~~~
**if .. else ... 規則**
~~~
if ( $condition1 ) {
...
} else if ( $condition2 ) {
...
} else {
...
}
~~~
盡可能避免以下使用方式,例:
~~~
if ( $condition1 )
...
else
...
~~~
**switch規則**
每個case塊結束處必須加上break,而default總應該存在處理未知情況,例:
~~~
switch( $condition )
{
case $value1:
...
break;
case $value2:
...
break;
default:
...
break;
}
~~~
**聲明定位規則**
聲明代碼塊需要對齊,且初次使用變量時需要初始化,例:
~~~
$tableName = '';
$databaseObject = '';
~~~
不使用以下方式,例:
~~~
$tableName;
$accuntName = '';
$databaseObject = '';
~~~
**數組定義規則**
數組元素代碼塊需要對齊,例:
~~~
$sqlData = [
'nickname' => 'MrYe',
'age' => '20',
'height' => '173cm',
];
~~~
## 四、其它說明篇
所有類方法必須有返回值,除結果簡單外返回true或者false之外,其它方法應返回不同的值。
不要采用缺省方法測試非零值,必須顯式測試,例:
~~~
if( false != $this->isAjax() ) {
} else {
}
~~~
不要使用以下方式,例:
~~~
if( $this->isAjax() ) {
} else {
}
~~~
不要使用三元邏輯符 ? :,但對變量的賦值除外,例:
~~~
$_GET['act'] = !empty( $_GET['act'] ) ? $_GET['act'] : 'v_login';
~~~
* 對于get、post、session、cookie類型變量,必須使用框架內部方法進行定義和調用。
* 盡可能使用單引號''而不是雙引號''。
* 使用完畢后的數組變量、對象變量、查詢集合必須馬上使用unset()、free\_result()釋放資源。
* 一個php文件只能包含一個類定義編碼,以類名稱作為文件名稱。
* 如果發覺您在程序中的命名只有少量能和其對應事物相匹配的話,請重新設計系統。
* 在為類命名前首先要知道它是什么。如果通過類名提供的線索,您還是想不起這個類是什么的話,那么您的設計是做得不夠好。
* 超過三個單詞組成的混合名是容易造成系統各個實體間的混淆,請重新設計類。
* 通常每個方法只執行一項邏輯動作事務,所以對它們的命名應該清楚的說明它們是做什么的:用checkForErrors()代替errorCheck(),用dumpDataToFile()代替dataFile()。
## 五、程序注釋篇
**類的注釋**
~~~
// +----------------------------------------------------------------------
// | onegow [ WE CAN DO IT MORE SIMPLE]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2018 http://onegow.com All rights reserved.
// +----------------------------------------------------------------------
// | Author:【作者名稱】 Email:【作者郵箱】
// +----------------------------------------------------------------------
// | 【類的用途】
// +----------------------------------------------------------------------
~~~
**類方法的注釋**
~~~
/**
* 【方法的用途】
* @param integer $id 用戶id
* @return array|false|\PDOStatement|string|Model
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
~~~
**類屬性的注釋**
~~~
/**
* 【類屬性的說明】
* @var null
*/
~~~
**代碼流程注釋**
~~~
//判斷是否是ajax請求
if( $this->isAjax() ) {
} else {
}
~~~