本文目的

通过制定规范,在编码中遵守规范,达到提高可读性,提高debug效率的效果

文章内容大部分为亲身体会,小部分网络引用

宁愿花两天写功能两小时做测试,也不要两小时写功能测试两天
清晰的代码结构可以在需要更新代码的时候事半功倍

文件格式

  1. 只有php代码的文件,末尾省略?>,防止多余空格和其他字符影响代码
  2. Model、View 、Controller、batch、建表文件均为UTF-8格式
  3. 文件命名应具有识别度,应使用英文或不容易引起歧义的拼音或拼音简写
  4. 避免在代码区域使用全角字符
  5. 在整段代码区块内使用缩进,建议使用4个空格而不是tab缩进
  6. 尽量做到代码即文档,因为随时都可能变化的需求不会有时间去随时更新一份文档,在文档中随时标记注释

流程控制

  1. 一个循环for foreach while中最多只有一个continue,多处使用continue会使代码晦涩难懂难以查错
  2. 在循环起始处,初始化需要清空的变量和数组
  3. 尽量避免多层循环嵌套,效率低下并且难以debug,可以尝试通过多次循环替代多层循环嵌套
  4. 尽量避免多层if{}else{}嵌套,能不嵌套时就尽量不使用3层以上的嵌套
  5. 在要求数据同步进行数据库操作时使用数据库事务

数据处理

  1. 不相信任何用户经手的数据,包括但不限于ajax请求、html表单、上传文件,使用addslashes避免sql注入
  2. 明晰=====的区别,以及!=!==的区别,避免不可预期的字符串在php内部转为数字类型造成的精度错误
  3. 超过16位的纯数字字符串禁止使用==来判断相等,参考php的坑,浮点数相关,与bccomp函数
  4. php5.5以上版本已支持yield异步特性,这是一个提高程序效率降低内存使用的神奇语法,请务必熟悉
  5. 如果需要修改数据格式,在尽量原始的地方修改格式(数据库sql > php > 前端js)
  6. 尝试用程序解决问题,锻炼逻辑思维,用程序解决问题是程序员的根本

模块化思想

  1. 只要想,总能把一大块代码拆成函数
  2. 模块化的程序更好查错,更便于性能优化,有的时候写成函数不是为了重用,是为了封装
  3. 大体把模块化的程序分为:功能函数(例如权限check,发信函数), 业务函数(例如业务间的订单推送),纯数据操作函数(例如反序列化共通,打包商品拆包)

    • 功能函数要做到通用化,健壮性,由于程序中使用量比较大,要尽量考虑到之后可能出现的各种需求,对性能要有较高要求,因为这一个函数会拖累所有调用它的程序
    • 业务函数要做到使用者不需考虑与他无关的业务,通过设计对接方法,将业务封装在自身函数中,程序出错时错误信息尽量覆盖所有情况,做到使用者不需查看函数源码,提高开发效率
    • 纯数据操作函数要做到不掺杂业务,因为不掺杂业务的函数通用性最高
  4. 模块化的思想可以更好的支持单元测试,如果我们在控制器返回json串之前不是一大段代码,而是封装了一个函数,那么我们可以写代码来自动化测试函数功能(只是个想法,我没试过)

javascript

  1. 前端check报错需要一次性判断所有错误后弹出提示框
  2. 能够在前端check错误的表单项,首先前端check,但是不能因为前端check了后端就省略addslashes操作和正确性检查
  3. 尝试开发通用类库来简化前端展示数据的代码

数据库

  1. 避免使用数据库关键字作为表名键名,应尽量在表名列名中包含更多的信息,如数据的名称、来源、用途、类型
  2. 同一个业务需求上,一系列表的命名应统一,若两列数据的来源、名称、用途、类型均一致,应使用相同的命名、类型
  3. 明晰NULLEmpty String的细微区别,以及数据查询上可能出现的问题
  4. 使用恰当的数据类型以便获得更快的性能和更佳的安全性,善用enum等高效数据类型
  5. 明晰FORMATTRUNCATEROUND的细微区别,从数据库规范数据格式
SELECT
    FORMAT(123456.789,2),
    TRUNCATE(123456.789,2),
    ROUND(123456.789,2)
FORMATTRUNCATEROUND
123,456.79123456.78123456.79
  1. 熟悉mysql时间处理函数,mysql字符串处理函数,使用恰当的函数规范数据格式
SELECT
    NOW(),
    UNIX_TIMESTAMP(NOW()),
    FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())),
    CONCAT('My','Sql')
NOWUNIX_TIMESTAMPFROM_UNIXTIMECONCAT
2017-05-11 10:10:4914944686492017-05-11 10:10:49MySql
  1. 熟悉mysql注释的两种写法 -- something/* something */,在复杂sql的改版或更新出标志注释以便维护

附录参考

mysql性能优化的最佳21条经验

PEAR简介

php开发编码规范

php代码层面性能优化与可读性优化

最后修改:2021 年 01 月 12 日
如果觉得我的文章对你有用,请随意赞赏