写好注释的核心是提升可维护性:函数注释用PHPDoc说明功能、参数、返回值及副作用;行内注释解释“为什么”而非“做什么”;类注释阐明职责与上下文;注释须随代码同步更新,避免失效误导。
写好注释不是为了应付检查,而是让未来的你、或者接手代码的同事,能快速看懂逻辑、少踩坑、少猜意图。
函数/方法注释:说清“做什么”和“怎么用”
每个公开或关键的函数,都该有清晰的文档块。PHPDoc 是主流标准,IDE 和工具(比如 PHPStan、PHPStorm)能据此做类型检查和自动补全。
重点写三件事:功能一句话概括、参数含义与类型、返回值说明。如果函数有副作用(比如修改全局变量、写文件),也得注明。
- 用 @param 标明每个参数名、类型、用途,如 @param string $name 用户姓名
- 用 @return 说明返回类型和意义,比如 @return array|false 查询结果或失败时返回 false
- 复杂逻辑分支或异常场景,可在正文补充简要说明,不堆砌细节,但点出关键约束
行内注释:解释“为什么”,而不是“做什么”
代码本身已说明“做什么”,注释应聚焦在“为什么这样写”。比如绕过某个框架限制、兼容旧数据格式、临时规避一个未修复的 bug。
立即学习“PHP免费学习笔记(深入)”;
避免写“初始化数组”这种废话,但可以写“此处初始化为空数组,因后续 foreach 要求变量已定义,避免 Notice 报错”。
- 单行注释用 //,紧跟在代码下方或右侧(保持可读性)
- 涉及多行逻辑时,用 /* */ 包裹,确保语义完整
- 看到自己写的“TODO”、“FIXME”、“HACK”,记得定期清理或跟进,别让它变成永久遗迹
类与属性注释:交代上下文和职责边界
类注释不是重复类名,而是说明这个类在整个系统里扮演什么角色、它依赖谁、被谁使用、有没有生命周期约束(比如是否单例、是否可复用)。
关键属性(尤其是 public 或 protected 的)建议加注释,特别是类型不明确、或含义容易误解的字段。
- 类顶部用 PHPDoc 描述设计意图,例如:@package AppServices、@see UserService::updateProfile()
- 对魔术属性(如 $fillable、$casts)或配置型属性,注明其作用范围和影响
- 避免为 private 属性过度注释,除非逻辑特别隐蔽或有特殊约定
保持注释与代码同步:失效的注释比没有更危险
改了代码却忘了更新注释,会让阅读者产生信任危机。与其留着过时的说明,不如删掉或打上明显标记。
- 重构函数时,顺手检查并更新对应 PHPDoc 中的 @param 和 @return
- 删除一段逻辑,别只删代码,把相关注释一并清理
- 团队可用 PHP_CodeSniffer 或 PHP-CS-Fixer 配合规则,提醒缺失或格式错误的文档块