# PHP 开发规范
# 命名规范
【强制】代码中的命名均不能以下划线开始,也不能以下划线或美元符号结束
- 反例:$name / $name$ / $name /$name__
【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式
- 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式 也要避免采用。
- 正例:alibaba / taobao / shanxi 等国际通用的名称,可视同英文。
- 反例:DaZhePromotion [打折] / getPingfenByName() [评分] / $某变量 = 3
【强制】类名使用 UpperCamelCase 风格
- 正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
- 反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。
- 正例:localValue / getHttpMessage() / inputUserId
// 获取某个用户的信息,方法名前缀使用get/变量名后缀使用info
getUserInfo() / $userInfo
// 获取多个用户的信息,方法名前缀使用list/变量名后缀使用list
listUserInfo() / $userList
// 统计用户数据,方法名前缀使用count/变量名后缀使用count
countUser() / $userCount
// 新增用户信息,方法名前缀使用create
createUser()
// 删除用户信息,方法名前缀使用delete
deleteUser()
// 修改用户信息
updateUser()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
- 正例:MAX_STOCK_COUNT
- 反例:MAX_COUNT
【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词 组合来表达其意。
- 正例:$finishCount
- 反例:$a
【推荐】如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。
- 正例:class OrderFactory / LoginProxy
# 代码格式
【强制】左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格;而左大 括号前需要空格。
- 正例:if(a == b)
- 反例:if( a == b )
【强制】if/for/while/switch/do 等保留字与括号之间都必须加空格。
【强制】任何二目、三目运算符的左右两边都需要加一个空格。
- 说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号等。
【强制】注释的双斜线与注释内容之间有且仅有一个空格。
- 正例:// 这是示例注释,请注意在双斜线之后有一个空格
- String ygb = new String();
【强制】单行字符数限制不超过 120 个,超出需要换行,换行时遵循如下原则:
- 第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
- 运算符与下文一起换行。
- 方法调用中的多个参数需要换行时,在逗号后进行。
- 反例:// 参数很多的方法调用可能超过 120 个字符,不要在逗号前换行 method(args1, args2, args3, ..., argsX);
【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
- 正例:method(args1, args2, args3);
【强制】需求完成之后,使用 phpstorm 格式化代码功能对代码风格进行统一管理,使用 phpstorm 默认的代码风格,windows 快捷键 ctrl + alt + L, mac 快捷键 option + command + L(强制执行)
【推荐】单个方法的总行数不超过 100 行
- 说明:包括方法签名、结束右大括号、方法内代码、注释、空行、回车及任何不可见字符的总 行数不超过 100 行。
- 正例:代码逻辑分清红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码 更加清晰;共性逻辑抽取成为共性方法,便于复用和维护。
【推荐】不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
- 说明:任何情形,没有必要插入多个空行进行隔开。
# 控制语句
【强制】在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default 语句并且 放在最后,即使空代码。
【强制】在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,严禁采用 单行的编码方式:if (condition) statements;
【强制】在高并发场景中,避免使用”等于”判断作为中断或退出的条件。
- 说明:如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间 判断条件来代替。
- 反例:判断剩余奖品数量等于 0 时,终止发放奖品,但因为并发处理错误导致奖品数量瞬间变 成了负数,这样的话,活动无法终止。
【强制】循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、 获取数据库连接,进行不必要的 try-catch 操作(这个 try-catch 是否可以移至循环体外)。
【推荐】表达异常的分支时,少用 if-else 方式,这种方式可以改写成:
- if (condition) { ... return obj; } // 接着写 else 的业务逻辑代码;
- 说明:如果非得使用 if()...else if()...else...方式表达逻辑,【强制】避免后续代码维 护困难,请勿超过 3 层。
【推荐】除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将 复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。
- 说明:很多 if 语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么 样的条件执 行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
- 正例: $boolean = (file_open($fileName, "w") != null) && (...) || (...); if ($boolean) { ... }
- 反例:if ((file.open(fileName, "w") != null) && (...) || (...)) { ... }
# 注释规约
【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不得使用 // xxx 方式。
【强制】所有的类都必须添加创建者和创建日期。
【强制】方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释 使用/* */注释,注意与代码对齐。
【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑 等的修改。
【参考】谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。
- 说明::代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没 有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库保存了历史代码)。
【参考】对于注释的要求:第一、能够准确反应设计思想和代码逻辑;第二、能够描述业务含 义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同 天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看 的,使其能够快速接替自己的工作。
【参考】好的命名、代码结构是自解释的,注释力求精简准确、表达到位。避免出现注释的 一个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。
# 交互标准
- 接收参数或返回参数,命名格式必须用下划线链接。
正例:
[
'total_money' :100,
'total_price':100,
]
2
3
4
当某个接口接收参数,或返回数据格式发生改变时,通过用版本号来兼容新旧业务。
- 正例:www.test.com/api/v1/jingxuan/order_goods_list
- 当接口参数发生改变或返回数据格式发生改变,保留原接口,并在原接口基础上升级版本
- www.test.com/api/v2/jingxuan/order_goods_list
pc 和小程序接口不再对使用端区分,相同业务共用一个接口。
# 其它
- 【推荐】及时清理不再使用的代码段或配置信息。