引言:为什么“整洁代码”关乎金钱与精力,而非吹毛求疵
\n\n想象一下,你打开一个一年前用PHP编写的旧项目。你打开文件 index.php,映入眼帘的是——HTML、SQL查询、echo语句以及名为 f1() 的函数的大杂烩。熟悉吗?如果是,那么你要么是刚刚起步的新手,要么是接手了“遗留”项目的经验丰富的开发者。
PHP整洁代码并非追逐时尚,也不是团队负责人的一时兴起。它是节省时间、精力和金钱的工具。在本文中,我们将探讨如何将你的PHP代码从“草稿”转变为令你和同事都满意的“定稿”。我们将讨论PSR标准、SOLID原则、正确的命名规范,并提供真实示例。开始吧!
\n\n1. 整洁代码的哲学:核心原则
\n\n在深入语法之前,让我们先约定游戏规则。整洁代码是指:
\n\n- \n
- 无需注释即可理解(尽管有时注释是必要的)。 \n
- 易于测试。 \n
- 不惧怕重构。 \n
- 在整个项目中遵循统一的风格。 \n
罗伯特·C·马丁(Bob大叔)在其著作《整洁代码》中说过:“快速编码的唯一方法就是写好代码”。如果你写得又快又乱,一个月后你将花费十倍的时间进行调试。让我们从别人的错误中学习,而不是重蹈覆辙。
\n\n2. PSR标准:迈向秩序的第一步
\n\n在PHP世界中,有PSR(PHP标准建议)——社区采纳的推荐规范。如果你不使用它们,你至少是在给阅读你代码的自己和同事增加难度。
\n\n2.1 PSR-1 和 PSR-12:基础编码风格
\n\nPSR-1 规定了通用规则,而 PSR-12 是扩展风格。以下是几个关键点:
\n\n- \n
- 文件应仅使用
<?php或<?=。 \n - 文件编码为 UTF-8 无 BOM。 \n
- 类名应使用
StudlyCaps(例如UserController)。 \n - 方法和属性名应使用
camelCase(例如getUserName())。 \n - 缩进使用4个空格(而非制表符!)。 \n
糟糕代码示例:
\n<?\nclass user_controller {\n\tfunction Get_User_Name($id) {\n\t\t$name = Db::query("SELECT name FROM users WHERE id=$id");\n\t\treturn $name;\n\t}\n}\n\n\n良好代码示例(符合 PSR-12):
\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controllers;\n\nuse App\\Models\\User;\n\nclass UserController\n{\n public function getUserName(int $id): ?string\n {\n $user = User::find($id);\n return $user ? $user->getName() : null;\n }\n}\n\n\n看到区别了吗?第二个版本读起来像一本书:方法的功能、接受和返回的数据类型一目了然。
\n\n2.2 PSR-4:类的自动加载
\n\n忘记在每个文件中使用 require_once。使用 Composer 和 PSR-4。这允许根据命名空间自动加载类。文件夹结构应与命名空间对应:
src/\n App/\n Controllers/\n UserController.php\n Models/\n User.php\n Services/\n PaymentService.php\n\n\n在 composer.json 中,只需一行即可配置:
{\n "autoload": {\n "psr-4": {\n "App\\\\": "src/"\n }\n }\n}\n\n\n3. 正确的命名规范:如何避免将变量命名为 $a
\n\n命名占成功的一半。糟糕的变量名甚至可能迷惑天才。让我们分析常见的错误。
\n\n