PHP 編碼規(guī)范
命名篇
- 變量命名
- 所有字母都使用小寫;對(duì)于一個(gè)變量使用多個(gè)單詞的,使用"_"作為每個(gè)詞的間隔
- 例如:
$user_name = "tony";
$red_rose_price = 123;
- 常量命名
- 所有字母使用大寫;多個(gè)單詞間使用"_"作為間隔
- 例如:
define('ALI_TIMESTAMP',365*24*60*60);
define('TIMING_SERVER_NAME', '106.31.89.92');
- 類命名
- 大駝峰命名法。以大寫字母開頭,多個(gè)單詞組成的變量名,單詞之間不用間隔,各個(gè)單詞首字母大寫
- 例如:
class LearningRoomController extends BaseController
{
}
- 方法或函數(shù)
- 小駝峰命名法。以小寫字母開頭,多個(gè)單詞組成的變量名,單詞之間不用間隔,各個(gè)單詞首字母大寫
- 例如:
function postFeed()
{
//業(yè)務(wù)邏輯
}
class LearningRoomController extends BaseController
{
public function postFeed()
{
//業(yè)務(wù)邏輯
}
}
- 數(shù)據(jù)庫表命名
- 表名均使用小寫字母;
- 對(duì)于多個(gè)單詞組成的表名,使用_間隔
- 例如:
t_learning_feed_image
t_learning_farm_user_study_record
- 表字段命名
- 均使用小寫字母;
- 對(duì)于多個(gè)單詞組成的字段,使用_間隔
- 例如:
feed_id
actual_score
un_goal_day_count
風(fēng)格篇
-
代碼縮進(jìn)
- 使用4個(gè)空格作為縮進(jìn),而不使用tab縮進(jìn)
-
大括號(hào){ }
- 結(jié)構(gòu)控制代碼編寫,如if、for、while、switch等結(jié)構(gòu),大括號(hào)不換行
- 類、方法、函數(shù) 大括號(hào)換行
for ($i = 1; $i < 10; $i++) {
}
if ($a > 1) {
}
foreach ($arr as $key => $value) {
}
function postFeed()
{
}
class A
{
public function a()
{
}
}
- 小括號(hào)( ) 與 運(yùn)算符
- 左括號(hào)的右邊,右括號(hào)的左邊不加空格
- 每個(gè)逗號(hào)"," 分號(hào)";" 邏輯運(yùn)算符">" "=" ">=" "<" 等等,前面不空格,后面空格
class A
{
public function a($paramsOne, $paramsTwo, $paramsThree)
{
for ($i = 1; $i <= 10; $i++) {
}
}
}
- switch break continue
- switch 語句每個(gè)case后面要有break;最后必須要有default模塊
- 在多層嵌套語句中使用break continue 時(shí)要注意層級(jí)關(guān)系,switch的case結(jié)構(gòu)會(huì)被當(dāng)做一層
for ($i = 1; $i <= 10; $i++) {
switch ($i) {
case 1:
echo 123;
break;
case 2:
echo "nihao";
break;
case 8:
break;//如果想中斷for循環(huán) 則要使用 break 2; continue 同理
default:
echo "gan!";
}
}
注釋篇
- 類注釋
/**
* @ Purpose:
* 訪問數(shù)據(jù)庫的類,以O(shè)DBC作為通用訪問接口
* @Author: Forrest Gump gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into()參數(shù)位置第二和第三個(gè)位置調(diào)換
* John Johnson John@crtvu.edu.cn
* @See: (參照)
*/
class Database
{
……
}
- 函數(shù)注釋
/**
* @Purpose:
* 執(zhí)行一次查詢
*
* @Param: string $queryStr SQL查詢字符串
* @Param: string $username 用戶名
*
* @Author: Michael Lee
*
* @Return: mixed 查詢返回值(結(jié)果集對(duì)象)
*/
function abc($queryStr,$username)
{……}
- 單行注釋盡量寫在代碼上一行,而不是行尾
//定義一個(gè)用戶名
$user_name = "Tony";
業(yè)務(wù)篇
- 數(shù)據(jù)庫部分
- 1.所有新增數(shù)據(jù)表,表結(jié)構(gòu)修改,必須嚴(yán)格遵守?cái)?shù)據(jù)庫建表規(guī)范,且由后臺(tái),微服務(wù),PHP三組組長評(píng)審?fù)ㄟ^以后才能予以修改,且必須寫明字段注釋。修改完成以后必須告知所有服務(wù)端人員以及數(shù)據(jù)組相關(guān)人員。
- 2.每次上線,應(yīng)跟隨代碼提交所有的SQL語句,并做對(duì)應(yīng)業(yè)務(wù)說明。SQL語句必須使用索引,而且要提前預(yù)估大數(shù)據(jù)量可能會(huì)導(dǎo)致的問題。
- 3.對(duì)于測試數(shù)據(jù)庫,如果開發(fā)和測試的時(shí)候有特殊需要,改完以后必須要予以恢復(fù),以保證測試服數(shù)據(jù)的完整性。禁止通過任何方式私自改動(dòng)生產(chǎn)環(huán)境數(shù)據(jù)庫數(shù)據(jù),必須經(jīng)過審批且通過。
- 4.禁止在循環(huán)里面嵌套查詢。
- 5.盡量避免連表查詢,如果實(shí)在要連表查,不要超過2張表。
- 6.避免重復(fù)查詢。在一次請(qǐng)求的生命周期中,避免多次重復(fù)查詢同一組數(shù)據(jù)??梢酝ㄟ^傳參的方式將需要使用的數(shù)據(jù)傳達(dá)給后面的函數(shù)
-
代碼部分
- 所有表model必須存放在model 文件夾中
- 業(yè)務(wù)實(shí)現(xiàn)寫在service層,controller只做業(yè)務(wù)拼接
- 避免寫超過4層嵌套的if else 邏輯嵌套,復(fù)雜的邏輯拆分成多個(gè)方法,以提高代碼可讀性。
- 復(fù)雜業(yè)務(wù)必須要先做好設(shè)計(jì)方案和預(yù)演。如果涉及多方,必須要一起開會(huì)討論,確定方案
- 業(yè)務(wù)設(shè)計(jì)要盡量減少數(shù)據(jù)庫查詢,盡量減少接口調(diào)用,盡量不返回多余數(shù)據(jù)的原則。對(duì)于可能會(huì)頻繁訪問的接口,可以多使用緩存。
- 相同業(yè)務(wù)代碼要盡量可以復(fù)用,組內(nèi)人員在開發(fā)之前要溝通好,不要相同的代碼寫很多遍。但是也要注意,如果業(yè)務(wù)有不同,也不要強(qiáng)行復(fù)用,該區(qū)分的時(shí)候也要做好區(qū)分。如果有不確定的地方,可以一起討論。
-
Git版本管理部分
- 嚴(yán)格按照git分支管理策略,任何臨時(shí)的需求或者小的改動(dòng),都要拉分支做開發(fā)。不同需求使用不同分支,最后按上線計(jì)劃進(jìn)行合并上線
- git的commit信息要簡要描述清楚提交的內(nèi)容,禁止提交mmm aaa 123等無意義的字符
- 合并代碼采取提交merge request 方式。提交申請(qǐng)后,執(zhí)行代碼審查流程通過后方可合并。
-
開發(fā)部分
- 確保需求確認(rèn)一致,各方實(shí)現(xiàn)方案互通后在開始開發(fā),任何不明確的地方均要主動(dòng)溝通確認(rèn)并負(fù)責(zé)跟蹤消息同步進(jìn)度,確保需求的變更傳達(dá)到每一環(huán)。
- 發(fā)現(xiàn)需求中流程走不通或者產(chǎn)品設(shè)計(jì)特別復(fù)雜的地方,要及時(shí)與產(chǎn)品溝通。討論方案可行性或者研討優(yōu)化方案。
- 發(fā)揮主觀能動(dòng)性,積極推展項(xiàng)目進(jìn)度,積極推進(jìn)各方交流。不要只顧自己開發(fā),造成互相等的情況。
- 要有deadline意識(shí),遇到技術(shù)難點(diǎn)或者自己能力不足的地方及時(shí)與組長溝通,不要等到最后才上報(bào),導(dǎo)致影響項(xiàng)目進(jìn)度節(jié)點(diǎn)延期。
- 一定要注意數(shù)據(jù)的驗(yàn)證,使用數(shù)據(jù)前要做判空和類型鑒定,避免由于空對(duì)象,錯(cuò)誤的數(shù)據(jù)類型導(dǎo)致拋出異?;蛘弋a(chǎn)生預(yù)期外的結(jié)果。例如數(shù)據(jù)庫查詢結(jié)果為空時(shí),直接獲取對(duì)象屬性則會(huì)拋出異常。字符串搜索等函數(shù)要注意0和===的區(qū)別等等。
- 嚴(yán)格按照項(xiàng)目設(shè)計(jì)去開發(fā),使用封裝好的公共方法去做數(shù)據(jù)驗(yàn)證和結(jié)果返回,保證返回給客戶端的數(shù)據(jù)類型的一致性。
- 所有接口一律要在showDoc上提供接口文檔,標(biāo)明用法,參數(shù),返回值。對(duì)返回值中的數(shù)據(jù)要寫明注釋。
- 注釋清晰。復(fù)雜的方法要有流程步驟注釋,函數(shù)的參數(shù)要有注釋,且寫明參數(shù)類型。
多次的redis操作盡量采取pipline去操作,減少IO。盡可能的多使用緩存,同時(shí)要注意緩存穿透,雪崩等常見問題。
-
接口設(shè)計(jì)
- 接口參數(shù)盡量少,格式簡單,避免多層嵌套參數(shù) 如數(shù)組,json字符串(特殊情況除外)
- 返回?cái)?shù)據(jù)要有封裝意識(shí)。要對(duì)數(shù)據(jù)進(jìn)行抽象,同一類型的數(shù)據(jù),同一含義的數(shù)據(jù)在不同的接口里要保持一致。對(duì)象要進(jìn)行封裝再返回。禁止將所有字段揉在一起,做一個(gè)層級(jí)返回
- 返回?cái)?shù)據(jù)較多時(shí),要寫明注釋
- 不要在一個(gè)接口里完成所有功能,應(yīng)盡可能的將不同的業(yè)務(wù)拆分成不同的接口,避免通過各種type去組合功能。
{
"result": true,
"errorCode": 0,
"errorMsg": "成功",
"isEnd": false,
"groupList": [
{
"groupInfo": { //群信息
"id": 4182, //群id
"name": "167、162、16", //群名稱
"createTime": 1595297040000, //群創(chuàng)建時(shí)間
}
]
}
- 接口交付
- 接口開發(fā)應(yīng)先交付接口文檔。再根據(jù)接口文檔進(jìn)行開發(fā)
- 接口交付一定要自己完成自測,下游可用才算完成
- 接口返回值改動(dòng)要同步4端(android,ios,服務(wù)端,web端),并在群內(nèi)@相關(guān)人員