• 在 foreach 中不要使用 array_merge,不仅慢而且耗费内存,可以在 foreach 中对要合并的数组进行赋值,在 foreach 外部统一进行合并,具体性能差异可以参考这篇文章:不要在循环体中使用 array_merge()

  • 在 foreach 中也不要使用 array_push,可以通过向数组中赋值的方式代替,比如:$students[] = $student[‘id’], 而不是 array_push($students, $student[‘id’]),具体性能差异可以参考这篇文章:不要在循环体中使用 array_push()

  • 针对一些查询较为复杂或者比较核心的逻辑里的 sql 查询,可以将 sql 语句写到注释中,这样看代码的时候不用再去拼接 sql,直接用注释中的 sql 拿来排查问题

  • 如果使用 phpstorm 可以安装 php inspections 插件来进行代码的静态分析,可以帮助查找代码规范,语法漏洞,函数使用方式方面的错误。其他的一些代码质量工具可以配置使用 phpcs,phpmd,phpcs-fixer,psalm,phpstan 等。而且可以通过 phpstorm 的热键录制功能,将徽标键 + s 设置为 phpcs-fixer,format code 的快捷键,这样写完时可以通过快捷键格式化代码。

  • 为避免在项目中将 dd,var_dump,exit,die 等函数提交到远程版本库中,可以在项目的 .git/hooks/pre-commit 中进行控制,加入下面的代码,每次提交时可以检测到。参考的这个:pre-commit

VAR=$(git diff --cached --diff-filter=ACMR | grep -wiE "var_dump|echo|exit|dd|die|console.log") if [ ! -z "\$VAR"  ]; then  echo "You've left a dd, var_dump, exit, die or console.log in one of your files! You don't really want to commit this so aborting now..." exit 1 fi
  • 在 for 循环的条件中不要使用函数,例如使用 count 来计算总数,这样每次循环都会执行一遍,不太好

  • 使用三元运算符时如果要做强制类型转换请记得要在运算区域加括号避免报错,例如:(string)$studentId ?? “",这样的写法会产生歧义,如果同为字符串不会报错,如果是这样:(string)$studentId ?? null,那么就会报错。建议写成 (string)($studentId ?? null)

  • 如果要做判断时要确定好运算符的优先级从而确保执行顺序,以免与预期相左,例如:

if ($isNew && $student = Stu::find($id) && isset($foo->con)) {  ... }

因为逻辑运算符 && 的运算优先级大于赋值运算符 =,所以上面这段代码可能会产生与预期不符的结果,这种情况下为保证执行顺序,尽量使用括号括起来。

包括下面这种:

if (!isset($student['birthday']) > time()) {  ... }

虽然逻辑运算符 !的优先级大于比较运算符 >,但手册中依然建议使用括号来明确运算顺序来增加代码可读性,手册中是这么说的:

“括号的使用,哪怕在不是必要的场合下,通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。”