引言:为什么你的PHP代码总被要求重写?
\n你提交了一个Pull Request,满怀信心地认为自己写出了完美的代码。一小时后,你看到了高级开发者的15条评论。熟悉吗?PHP的Code review不仅仅是一种形式,而是一场真正的成熟度考试。高级开发者看待代码的方式不是一组指令,而是一个需要持续发展和演进的系统。
\n在本文中,我们将分析你在审查中最常收到的意见。我们不会教你语法——你早已知道如何声明变量。我们将讨论代码文化、架构以及那些将可运行代码变成维护噩梦的陷阱。准备好了:这会很痛苦,但很有用。
\n\n1. 魔法数字和字符串:"42是什么意思?"
\n最常见也最令人恼火的错误。高级开发者看到代码中的if ($status == 3)会立刻扣分。数字3是一个魔法常量。一个月后,你自己都会忘记它代表什么。而新开发者会猜测:这是"已发布"状态、"草稿"状态还是"已删除"状态?
糟糕的写法:
\nif ($order->getStatus() == 3) {\n $order->sendNotification();\n}\n\n好的写法:
\nclass OrderStatus {\n const PENDING = 1;\n const CONFIRMED = 2;\n const SHIPPED = 3;\n const DELIVERED = 4;\n}\n\nif ($order->getStatus() === OrderStatus::SHIPPED) {\n $order->sendNotification();\n}\n使用命名常量使代码自文档化。你不仅仅是在写代码——你是在讲述一个故事。这是初级开发者经常忽略的主要php最佳实践之一。
\n\n2. God对象和500行的怪物
\n"这个类什么都能做!"——这句话会让高级开发者不寒而栗。当一个类既负责发送邮件,又负责生成PDF,还要处理数据库操作时,这就违反了单一职责原则(SRP)。这样的类无法测试,难以修改,并且在进行任何微小的重构时都必然会崩溃。
\n\nGod对象的特征:
\n- \n
- 类包含超过200-300行代码 \n
- 方法超过20-30行 \n
- 类名以"Manager"或"Helper"结尾 \n
- 方法接受5个以上参数 \n
解决方案很简单:拆分!将逻辑提取到服务、仓库、处理器中。PHP重构从小处着手——创建一个只做一件事但做得完美的类。
\n\n3. 通过PDO直接操作SQL
\n是的,如果你使用预处理语句,PDO可以防止注入攻击。但高级开发者希望在控制器中看到的是抽象层,而不是原始SQL。像Eloquent或Doctrine这样的ORM是标准。如果项目很小,至少使用Query Builder。
\n\n反模式:
\n$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');\n$stmt->execute([$email]);\n$user = $stmt->fetch();\n\n正确的方法:
\nclass UserRepository {\n public function findByEmail(string $email): ?User {\n return User::where('email', $email)->first();\n }\n}\n通过仓库模式工作可以轻松更换数据源(例如切换到Redis缓存),而无需重写整个项目。这就是PHP代码质量的价值所在。
\n\n4. 忽略strict_types
\nPHP是一种动态类型语言,但这并不意味着你可以像2005年那样写代码。在每个文件开头声明declare(strict_types=1);是专业性的标志。高级开发者讨厌函数期望接收int类型,却收到字符串"42"并默默进行转换。
declare(strict_types=1);\n\nfunction calculateTotal(int $price, int $quantity): int {\n return $price * $quantity;\n}\n\n// 这会抛出TypeError,而不是静默转换\necho calculateTotal('100', 2); /