本文目的
通过制定规范,在编码中遵守规范,达到提高可读性,提高debug效率的效果
文章内容大部分为亲身体会,小部分网络引用
宁愿花两天写功能两小时做测试,也不要两小时写功能测试两天
清晰的代码结构可以在需要更新代码的时候事半功倍
文件格式
- 只有php代码的文件,末尾省略
?>
,防止多余空格和其他字符影响代码 - Model、View 、Controller、batch、建表文件均为
UTF-8
格式 - 文件命名应具有识别度,应使用英文或不容易引起歧义的拼音或拼音简写
- 避免在代码区域使用全角字符
- 在整段代码区块内使用缩进,建议使用4个空格而不是tab缩进
- 尽量做到代码即文档,因为随时都可能变化的需求不会有时间去随时更新一份文档,在文档中随时标记注释
流程控制
- 一个循环
for foreach while
中最多只有一个continue
,多处使用continue
会使代码晦涩难懂难以查错 - 在循环起始处,初始化需要清空的变量和数组
- 尽量避免多层循环嵌套,效率低下并且难以debug,可以尝试通过多次循环替代多层循环嵌套
- 尽量避免多层
if{}else{}
嵌套,能不嵌套时就尽量不使用3层以上的嵌套 - 在要求数据同步进行数据库操作时使用数据库事务
数据处理
- 不相信任何用户经手的数据,包括但不限于ajax请求、html表单、上传文件,使用
addslashes
避免sql注入 - 明晰
==
和===
的区别,以及!=
和!==
的区别,避免不可预期的字符串在php内部转为数字类型造成的精度错误 - 超过16位的纯数字字符串禁止使用
==
来判断相等,参考php的坑,浮点数相关,与bccomp函数 - php5.5以上版本已支持yield异步特性,这是一个提高程序效率降低内存使用的神奇语法,请务必熟悉
- 如果需要修改数据格式,在尽量原始的地方修改格式(数据库sql > php > 前端js)
尝试用程序解决问题,锻炼逻辑思维,用程序解决问题是程序员的根本
模块化思想
- 只要想,总能把一大块代码拆成函数
- 模块化的程序更好查错,更便于性能优化,有的时候写成函数不是为了重用,是为了封装
大体把模块化的程序分为:功能函数(例如权限check,发信函数), 业务函数(例如业务间的订单推送),纯数据操作函数(例如反序列化共通,打包商品拆包)
- 功能函数要做到通用化,健壮性,由于程序中使用量比较大,要尽量考虑到之后可能出现的各种需求,对性能要有较高要求,因为这一个函数会拖累所有调用它的程序
- 业务函数要做到使用者不需考虑与他无关的业务,通过设计对接方法,将业务封装在自身函数中,程序出错时错误信息尽量覆盖所有情况,做到使用者不需查看函数源码,提高开发效率
- 纯数据操作函数要做到不掺杂业务,因为不掺杂业务的函数通用性最高
- 模块化的思想可以更好的支持单元测试,如果我们在控制器返回json串之前不是一大段代码,而是封装了一个函数,那么我们可以写代码来自动化测试函数功能(只是个想法,我没试过)
javascript
- 前端check报错需要一次性判断所有错误后弹出提示框
- 能够在前端check错误的表单项,首先前端check,但是不能因为前端check了后端就省略
addslashes
操作和正确性检查 - 尝试开发通用类库来简化前端展示数据的代码
数据库
- 避免使用数据库关键字作为表名键名,应尽量在表名列名中包含更多的信息,如数据的名称、来源、用途、类型
- 同一个业务需求上,一系列表的命名应统一,若两列数据的来源、名称、用途、类型均一致,应使用相同的命名、类型
- 明晰
NULL
和Empty String
的细微区别,以及数据查询上可能出现的问题 - 使用恰当的数据类型以便获得更快的性能和更佳的安全性,善用
enum
等高效数据类型 - 明晰
FORMAT
、TRUNCATE
、ROUND
的细微区别,从数据库规范数据格式
SELECT
FORMAT(123456.789,2),
TRUNCATE(123456.789,2),
ROUND(123456.789,2)
FORMAT | TRUNCATE | ROUND |
---|---|---|
123,456.79 | 123456.78 | 123456.79 |
- 熟悉mysql时间处理函数,mysql字符串处理函数,使用恰当的函数规范数据格式
SELECT
NOW(),
UNIX_TIMESTAMP(NOW()),
FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())),
CONCAT('My','Sql')
NOW | UNIX_TIMESTAMP | FROM_UNIXTIME | CONCAT |
---|---|---|---|
2017-05-11 10:10:49 | 1494468649 | 2017-05-11 10:10:49 | MySql |
- 熟悉mysql注释的两种写法
-- something
和/* something */
,在复杂sql的改版或更新出标志注释以便维护