引言:为什么代码审查不是关于控制,而是关于成长
PHP 中的代码审查不是管理者对下属的陈旧控制程序。这是开发人员之间的专业对话,旨在提高代码质量、在团队内部分享知识并在早期阶段预防错误。然而,实践表明,许多 PHP 开发人员(尤其是初学者)要么害怕审查,要么将其变成空洞的形式。
在本文中,我们将详细分析在审查 PHP 代码时具体要注意什么,如何提出意见以免冒犯同事,以及如何自己从这一过程中获得最大收益。本文内容基于在 PHP 7.4+ 项目以及 Laravel 和 Symfony 等框架上的实际工作经验。
1. 在 PHP 代码中检查什么:实用检查清单
没有通用的清单,但对于 PHP 项目,可以确定 5 个必须通过审查视角检查的关键领域。
1.1. 安全性
PHP 是一种容易引入漏洞的语言。首先检查:
- SQL 注入:是否使用了预处理语句(PDO / prepared statements)而不是字符串拼接?
- XSS(跨站脚本攻击):输出是否通过
htmlspecialchars()或模板引擎(Blade, Twig)进行了转义? - CSRF 保护:在修改状态的表单上是否有令牌?
- 输入验证:是否在服务器端检查了数据的类型和长度?
// 不好:SQL 中的字符串拼接$query = "SELECT * FROM users WHERE id = " . $_GET['id'];
// 好:PDO 预处理语句$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');$stmt->execute(['id' => $_GET['id']]);1.2. 架构与 SOLID 原则
即使项目不是企业级项目,也应遵守基本原则:
- 单一职责:类/方法是否做了太多事情?
- 依赖反转:代码是否使用接口而不是具体类?
- 避免上帝对象:是否存在超过 1000 行的类?
1.3. 风格与 PSR 标准
对于 PHP 来说,这至关重要。检查是否符合 PSR-12(编码风格):
- 缩进使用 4 个空格,而不是制表符。
- 类和方法的左花括号放在新行。
- 正确的命名:方法使用
camelCase,变量使用snake_case(除非项目另有约定)。
1.4. 性能
在 PHP 中很容易写出慢代码。查找:
- 循环中的查询(N+1 问题)——应改用 ORM 的预加载。
- 忽略缓存:重复计算相同的数据。
- 低效函数:例如,在大数组上使用
in_array()不如改用isset($hash[$key])。
// 不好:循环中的查询foreach ($users as $user) { $posts = DB::table('posts')->where('user_id', $user->id)->get();}
// 好:一次查询配合预加载$users = User::with('posts')->get();1.5. 错误处理与类型声明
- 文件开头是否有 strict_types?
- 是否对参数和返回值使用了类型声明?
- 是否处理了异常,而不是用空的
try-catch将其忽略?
2. 如何提供反馈:从“这很糟糕”到“让我们改进”
代码审查中最难的技能不是发现错误,而是正确地表达出来。糟糕的反馈会扼杀动力。好的反馈能教导并凝聚团队。
2.1. “三明治”法则
内