Clean Code on PHP:编写整洁代码的原则与示例

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

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

开始课程

什么是Clean Code以及为什么它在PHP中很重要?



Clean Code(整洁代码)不仅仅是一个时髦的术语,而是一种开发哲学,它帮助编写不仅机器能理解、人类也能理解的程序。在PHP的背景下,代码通常由不同的团队多年维护,遵循整洁代码的原则成为一项至关重要的技能。



整洁代码具有几个关键特征:

  • 无需注释即可轻松阅读和理解
  • 可预测,执行时不会产生"意外"
  • 易于修改,且不会破坏系统的其他部分
  • 包含最少的重复(DRY原则)


在本文中,我们将通过具体的PHP代码示例来解析Clean Code的基本原则。



1. 变量和函数的命名



糟糕的示例:这段代码有什么问题?

// ❌ 糟糕的代码$a = 5;$b = 10;$c = $a * $b;

function calc($x, $y) { return $x + $y * 0.2;}

$d = calc($a, $b);


在这个示例中,变量 $a、$b、$c 的含义以及函数 calc 的作用完全不清楚。一个月后,您自己都不会记得当初为什么写这段代码。



良好的示例:有意义的名称

// ✅ 良好的代码$productPrice = 5;$quantity = 10;$totalCost = $productPrice * $quantity;

function calculatePriceWithTax(float $basePrice, float $taxRate = 0.2): float { return $basePrice + ($basePrice * $taxRate);}

$finalPrice = calculatePriceWithTax($totalCost);


PHP中的命名规则:

  • 变量使用名词($userName、$orderTotal)
  • 函数使用动词(getUser()、calculateTotal())
  • 不要缩写名称(写 $customerAddress,而不是 $custAddr)
  • 避免单字母变量(循环计数器 $i、$j 除外)
  • 布尔变量以 is、has、can 开头($isActive、$hasPermission)


2. 小函数和单一职责原则(SRP)



问题:瑞士军刀式函数

// ❌ 糟糕的代码:一个函数做所有事情function processOrder(array $orderData): array {    // 验证    if (empty($orderData['email'])) {        throw new Exception('Email required');    }        // 保存到数据库    $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', '');    $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)");    $stmt->execute([$orderData['email'], $orderData['total']]);        // 发送邮件    mail($orderData['email'], 'Order confirmed', 'Thank you!');        // 日志记录    file_put_contents('log.txt', 'Order processed: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);        return ['status' => 'success'];}


这个函数违反了单一职责原则(Single Responsibility Principle)。它同时负责验证、数据库操作、发送邮件和日志记录。这些过程中的任何一个发生变化,都需要修改整个函数。



解决方案:分解为小函数

// ✅ 良好的代码:每个函数负责一个操作function validateOrderData(array $orderData): void {    if (empty($orderData['email'])) {        throw new InvalidArgumentException('Email is required');    }}

function saveOrderToDatabase(array $orderData): int { $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', ''); $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)"); $stmt->execute([$orderData['email'], $orderData['total']]); return (int)$pdo->lastInsertId();}

博客

书籍推荐