PHP中的Clean Code:原则与示例
每位PHP开发者都遇到过这样的情况:几个月后,自己写的代码变得难以理解。更不用说从之前团队继承的他人代码了。这会导致bug、新人入职适应期漫长,以及不愿进行修改。解决这个问题的方案就是Clean Code(整洁代码)原则,由Robert Martin(Bob大叔)推广。在本文中,我们将解析Clean Code在PHP中的关键原则,并查看具体示例。
1. 变量、函数和类的命名
正确的命名是可读代码的基础。名称应该回答以下问题:"这是什么?"和"这是做什么的?"。不要为了简洁而节省字母。
糟糕示例(糟糕的代码)
<?phpfunction getData($d, $u) { $r = []; foreach ($d as $i) { if ($i['status'] === 'active' && $i['user_id'] === $u) { $r[] = $i; } } return $r;}?>良好示例(整洁代码)
<?phpfunction getActiveOrdersByUser(array $orders, int $userId): array{ $activeOrders = []; foreach ($orders as $order) { if ($order['status'] === 'active' && $order['user_id'] === $userId) { $activeOrders[] = $order; } } return $activeOrders;}?>命名规则:
- 变量 — 名词:
$userName,$orderTotal。 - 函数 — 动词:
calculateTotal(),sendEmail()。 - 类 — 单数名词:
UserRepository,OrderProcessor。 - 布尔变量 — 以
is、has、can开头:$isActive,$hasPermission。 - 避免缩写(
$usr)、音译($sozdanieZakaza)和单字母变量(循环计数器$i除外)。
2. 函数:小而单一职责
函数应该只做一件事,并且把它做好。如果函数执行多个任务,就应该拆分。理想的函数大小是10–20行。
糟糕示例(函数包揽一切)
<?phpfunction processOrder(array $orderData): bool{ // 验证 if (empty($orderData['items'])) { return false; } // 计算总价 $total = 0; foreach ($orderData['items'] as $item) { $total += $item['price'] * $item['quantity']; } // 保存到数据库 $sql = "INSERT INTO orders (user_id, total, status) VALUES (?, ?, 'new')"; $stmt = $this->db->prepare($sql); $stmt->execute([$orderData['user_id'], $total]); // 发送邮件 mail($orderData['email'], 'Order Confirmation', 'Your order is placed'); return true;}?>良好示例(拆分为小函数)
<?phpclass OrderService{ public function processOrder(array $orderData): bool { if (!$this->validateOrder($orderData)) { return false; } $total = $this->calculateTotal($orderData['items']); $orderId = $this->saveOrder($orderData['user_id'], $total); $this->sendConfirmationEmail($orderData['email']); return true; }
private function validateOrder(array $orderData): bool { return !empty($orderData['items']); }
private function calculateTotal(array $items): float { $total = 0; foreach ($items as $item) { $total += $item['price'] * $item['quantity']; } return $total; }
private function s