PHP中的Clean Code:编写可读代码的原则

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐