
基础规范:从”能跑”到”好读”,这些细节决定代码质量
很多人觉得”代码能跑就行,规范不重要”,但我去年帮一个电商客户维护项目时,深刻体会到规范的重要性。他们之前的程序员写的代码,变量名全是拼音缩写,比如$yhzh
(用户账户)、$zfzt
(支付状态),我花了整整3天才理清核心逻辑。后来按规范重构后,新同事接手只花了半天就上手了。所以说,规范不是形式主义,是帮自己和团队省时间的”隐形生产力”。
命名和缩进:让代码像”人话”一样好懂
先说说最基础的命名规则。PHP社区其实有个公认的”交通规则”——PHP-FIG制定的PSR规范(你可以理解为PHP开发者的行为指南),其中PSR-1和PSR-2专门讲代码风格。比如变量和函数名要用”小驼峰式”,就是第一个单词小写,后面每个单词首字母大写,像$userName
、getUserInfo()
;常量呢,就得全大写,单词之间用下划线隔开,比如define('MAX_LOGIN_TIMES', 5);
。
我之前带过一个实习生,他写变量特别随意,$a
、$b
满天飞,有次写用户登录逻辑,$a
存用户名,$b
存密码,过两天他自己 debug 时都分不清哪个是哪个。后来我让他把所有变量名改成”做什么的+是什么”,比如$loginUserName
、$encryptedPassword
,不光他自己看得懂,团队其他人协作也顺畅多了。
缩进也很关键。PSR-2规定用4个空格缩进(别用Tab,不同编辑器显示不一样),代码块要对齐。比如if语句:
// 错误示范:缩进混乱,括号位置不对
if($user['age']>18){
echo "成年";}
else{
echo "未成年";
}
// 正确示范:4空格缩进,括号换行对齐
if ($user['age'] > 18) {
echo "成年";
} else {
echo "未成年";
}
你看,右边的是不是一眼就能看清逻辑结构?我自己现在写代码,都会开着编辑器的”显示空格”功能,强迫自己保持缩进一致,习惯后写起来反而更快。
注释:不只是”解释代码”,更是”记录思路”
很多人觉得注释就是”把代码翻译成中文”,比如// 给变量赋值
这种废话注释,完全没必要。好的注释应该告诉别人”为什么这么写”,尤其是复杂逻辑。PSR-5规范(文档注释标准) 用/ /
写类和函数注释,包含参数、返回值、用途。
我之前做一个会员积分系统,有个计算积分的函数特别复杂,涉及等级系数、消费金额、活动加成。当时我写了详细注释,包括每个参数的含义、特殊情况处理(比如负数金额怎么处理),半年后客户要加新规则,我翻开代码5分钟就想起来当时的设计思路,要是没注释,估计得重写一遍。
给你看个实用的注释模板,我现在写函数必用:
/
根据用户消费计算积分
@param float $amount 消费金额(单位:元,必须大于0)
@param int $level 用户等级(1-5级,影响积分系数)
@param bool $isActivity 是否活动期间(true额外加20%积分)
@return int 计算后的积分(向下取整)
@throws InvalidArgumentException 当金额
/
function calculatePoints($amount, $level, $isActivity = false) {
// ...具体逻辑...
}
这样不管谁看这个函数,都知道怎么传参、会返回什么、有什么注意事项。记住,注释是写给” 的自己”和”同事”看的,别偷懒。
进阶规范:安全+性能,让代码不只”好读”还”好用”
基础规范能保证代码”好读”,但真正的规范还得考虑安全和性能。我见过太多项目因为”图省事”跳过安全过滤,结果被注入攻击;或者循环嵌套太多,数据量大了就卡成PPT。这部分我结合两个真实案例,带你看进阶规范怎么落地。
安全过滤:别让”用户输入”成为漏洞入口
PHP最常见的安全问题就是没处理用户输入,比如直接把用户输入拼到SQL里,或者输出到页面时没转义。我2021年帮一个企业站做安全审计,发现他们的登录接口是这么写的:
// 错误示范:直接拼接用户输入,SQL注入风险!
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($sql); // 注意:mysql_函数早就被弃用了!
这种代码,黑客只要在用户名输入框填' OR '1'='1
,就能直接登录(这就是SQL注入)。后来我帮他们改成PDO预处理,问题立马解决:
// 正确示范:PDO预处理,参数绑定防注入
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT FROM users WHERE username = username AND password = password";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password); // 实际项目中密码要加密存储!
$stmt->execute();
除了SQL注入,XSS攻击也很常见——用户输入带标签的内容,直接输出到页面就会执行恶意脚本。解决办法很简单,输出前用
htmlspecialchars()
转义:
// 安全输出用户输入内容
echo "欢迎您:" . htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
这里提醒一句,PHP7.4以后推荐用htmlspecialchars($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')
,多一个ENT_SUBSTITUTE
参数,能把无效UTF-8字符替换成�,避免乱码问题。
性能优化:这些规范让代码跑得更快
规范不只是”不犯错”,还得”跑得快”。我之前优化过一个商品列表页,原来加载要3秒,改了几个规范点后,直接降到0.5秒。最关键的就是”减少数据库查询”和”避免循环嵌套”。
比如很多人习惯在循环里查数据库:
// 错误示范:循环查库,100条数据查100次!
foreach ($orderIds as $orderId) {
$sql = "SELECT FROM orders WHERE id = $orderId";
$order = mysql_query($sql); // 再次强调:别用mysql_函数!
$orders[] = $order;
}
这就像你去超市买东西,买100件商品却分100次结账,效率极低。正确的做法是用IN
查询一次搞定:
// 正确示范:一次查询多条数据
$orderIdsStr = implode(',', array_map('intval', $orderIds)); // 转成整数防注入
$sql = "SELECT FROM orders WHERE id IN ($orderIdsStr)";
$stmt = $pdo->query($sql);
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 用ID做键,方便后续查找
$orderMap = [];
foreach ($orders as $order) {
$orderMap[$order['id']] = $order;
}
这样不管多少条数据,都只查一次数据库,性能提升不止一点点。
循环嵌套也别太多。我见过一个同事写的代码,5层foreach嵌套,数据量大的时候直接超时。其实很多嵌套都能通过”提前准备数据”优化,比如用数组键值对替代内层循环查找。
下面这个表格 了5个实用规范实例,你可以直接对照改自己的代码:
规范类型 | 错误示例 | 正确示例 | 改进效果 |
---|---|---|---|
变量命名 | $a、$b、$data1 | $userId、$orderAmount、$userList | 可读性提升80%,协作效率提高 |
SQL查询 | 循环内多次查询 | IN查询+数组映射 | 数据库请求减少90%,加载速度提升 |
安全过滤 | 直接拼接用户输入到SQL | PDO预处理+参数绑定 | 彻底杜绝SQL注入风险 |
注释规范 | // 定义变量、// 执行查询 | 详细说明参数、返回值、异常情况 | 后期维护时间减少60% |
输出转义 | echo $_POST[‘content’]; | echo htmlspecialchars($content, ENT_QUOTES, ‘UTF-8’); | 防御XSS攻击,页面更安全 |
其实规范这东西,刚开始可能觉得麻烦,但写多了就成肌肉记忆了。我现在写代码,不用刻意想就能按规范来,反而比瞎写省时间。你可以先从命名和注释开始改,慢慢加入安全和性能优化的意识。
如果你按这些实例改了自己的PHP代码,欢迎回来告诉我有没有觉得代码清爽多了,或者遇到什么问题,咱们一起讨论怎么解决!
刚开始写PHP代码的时候,你是不是也觉得“规范”这事儿特麻烦?总想着先把功能跑起来再说,结果写着写着就乱了——变量名一会儿是$name
一会儿是$mingzi
,缩进有时用2个空格有时用Tab,到最后自己都看不下去。其实我当年刚开始学PHP的时候也这样,直到带我的师父让我先定个“小规矩”:前两周只管好两件事——变量用小驼峰(比如$userAge
而不是$userage
或$UserAge
),常量全大写加下划线(比如ORDER_STATUS_PAID
)。你还别说,就这一个小目标,我坚持了半个月,后来写变量时手指都形成条件反射了,再也不用纠结“这个词该怎么拼”。
光靠自己记肯定不够,得学会用工具偷懒。你用的IDE(比如PHPStorm或者VS Code)里都有“自动格式化”功能,像PHPStorm按Ctrl+Alt+L就能一键整理缩进、括号位置,VS Code装个PHP Intelephense插件也能实现。我之前带过个实习生,一开始总抱怨“缩进好烦”,我让他把格式化快捷键设成每天必按,两周后他自己都说“现在不格式化一下代码,看着都别扭”。另外啊,多看看优秀的开源项目源码真的有用,比如Laravel的核心文件里,每个函数上面都有详细的注释,不光说清参数和返回值,连“为什么这么设计”都写得明明白白——你跟着学几次,就知道“好注释”不是废话堆砌,而是能帮别人(也帮 的自己)省时间的说明书。最后记得留个“5分钟检查时间”,每次写完一个功能,花几分钟扫一遍:变量名是不是一眼能看懂?关键逻辑有没有注释?缩进有没有对齐?刚开始可能觉得麻烦,但坚持一个月,你会发现自己写代码的速度反而变快了——因为不用回头猜“我当时这行是啥意思”了。
PHP代码规范有统一的标准吗?
是的,PHP社区有公认的统一规范,即由PHP-FIG(PHP框架互操作性小组)制定的PSR规范。常见的有PSR-1(基础编码标准,规定文件格式、命名空间等)、PSR-2(编码风格指南,涵盖缩进、括号位置等),以及2019年发布的PSR-12(PSR-2的扩展,更详细的风格规范)。这些规范被Laravel、Symfony等主流框架广泛采用,是行业通用的“交通规则”。
不同PHP框架(如Laravel、ThinkPHP)需要遵循相同的代码规范吗?
主流框架通常会遵循PSR基础规范(如PSR-1、PSR-12),以保证代码的通用性和团队协作效率。不过部分框架可能有“框架特定规范”,比如Laravel推荐使用契约接口、ThinkPHP有自己的目录结构约定。 以框架官方文档为准,基础的命名规则、缩进格式等仍 遵循PSR标准,避免切换框架时出现风格混乱。
注释是不是写得越多越好?
不是。注释的核心是“解释代码背后的逻辑”,而非“翻译代码”。比如“// 定义变量”这种冗余注释完全没必要,而像“// 此处使用md5加密是为了兼容旧系统,后续将迁移到bcrypt”这种说明“为什么这么做”的注释才真正有价值。参考PSR-5文档注释标准,函数/类注释应包含用途、参数含义、返回值、异常情况,确保他人或“ 的自己”能快速理解设计思路。
如何快速检查自己的PHP代码是否符合规范?
推荐使用工具自动化检查:比如PHP_CodeSniffer(简称PHPCS),它可以根据PSR规范扫描代码,找出命名不规范、缩进错误等问题;也可以用PHP-CS-Fixer自动修复部分规范问题。 主流IDE(如PHPStorm)自带代码检查功能,开启后会实时标红不规范的代码,新手可以借助这些工具快速养成习惯。
新手刚开始写PHP代码,怎么养成规范的习惯?
可以从“小目标”开始:第一步固定命名风格(比如变量用小驼峰、常量全大写),第二步启用IDE的“自动格式化”功能(如PHPStorm的Ctrl+Alt+L),强制统一缩进和括号位置;第三步参考优秀开源项目(如Laravel源码),观察别人如何写注释和组织代码; 每写完一个功能后花5分钟“回头看”,检查是否有变量名模糊、注释缺失的情况,逐步形成肌肉记忆。