<?phpdeclare(strict_types=1);// PHP 8.0 之前:这只是一个注释// PHP 8.0+:这是属性语法,不是注释!#[Route("/api/users", methods: ["GET"])]// 如果确实要用 # 风格注释,避免以 [ 开头// 安全的写法# This is a safe comment// 推荐使用 // 风格避免歧义// This is always a comment
<?phpdeclare(strict_types=1);// 以下代码中的 PHP 会被执行!// 仅在浏览器端不可见(如果作为 HTML 输出的话)// <!-- <?php echo "I am still executed!"; ?> -->// 安全的做法:使用 PHP 注释来禁用代码// <?php // echo "I am truly commented out"; ?>
注释
注释是在代码中添加说明性文字的方式,这些文字会被 PHP 解析器完全忽略,不会被执行。良好的注释习惯能够显著提升代码的可读性和可维护性,是团队协作和长期项目维护的基础。
前置知识
基础概念
PHP 支持三种注释风格:
// ...# .../* ... *//** ... */性能说明
注释不会影响 PHP 代码的执行性能。PHP 解析器在编译阶段会完全忽略注释内容,不占用运行时的处理时间。
单行注释
C++ 风格单行注释
双斜杠
//是最常用的单行注释方式。从//开始到行末的所有内容都会被当作注释:单行注释在
//之后到行末的内容都被忽略:Shell 风格单行注释
井号
#同样表示单行注释,效果与//类似:PHP 8.0+ 注意事项
自 PHP 8.0 起,
#[具有特殊含义——它是属性(Attributes)语法。如果在#[后面紧跟的内容不符合属性语法,将导致解析错误:因此,推荐始终使用
//风格的单行注释,避免与 PHP 8.0+ 的属性语法冲突。多行注释
C 风格多行注释
多行注释以
/*开始,以*/结束,可以跨越多行:多行注释中不能嵌套另一个多行注释:
嵌套多行注释陷阱
多行注释
/* */不支持嵌套。第一个*/会结束注释,后面的内容将被正常解析。如果需要临时注释掉包含多行注释的代码块,可以使用单行注释//来包裹。一种常用的技巧是混合注释风格来实现"可切换的注释块":
要启用上面的代码块,只需删除
//*中的一个/,使其变为/*,整个代码块就变成了注释。多行注释在正则表达式中的陷阱
如果注释中包含正则表达式定界符
/,可能会意外提前结束注释:phpDoc 文档注释
phpDoc 是一种特殊的多行注释格式,以
/**开始(注意多了一个星号)。它遵循特定的格式规范,可以由工具(如 PHPDocumentor、phpDocumentor2)自动生成 API 文档。类和方法的文档注释
常用的 phpDoc 标签
@param@param string $name 用户名@return@return User 用户实体@throws@throws RuntimeException@var@var string@deprecated@deprecated 2.0 使用新方法替代@see@see UserService::getUserById()@since@since 1.5.0@package@package App\Services@author@author Zhang San <zs@example.com>函数的文档注释
详细说明
单行注释
//与多行注释/* */的交互 当不同风格的注释嵌套时,规则如下:一旦某种注释被打开,所有内容都会被忽略,直到该注释被关闭:
HTML 注释不会阻止 PHP 执行
HTML 注释
<!-- -->对 PHP 解析器完全无效。注释内的 PHP 代码仍然会被执行:注释中的结束标签陷阱
关键陷阱
在单行注释
//和#中,?>仍然会被解析为 PHP 结束标签!只有/* */多行注释不受此影响。临时禁用代码的技巧
实战示例
项目文件头的标准注释格式
代码审查注释规范
常用的审查注释标记:
TODOFIXMEHACKNOTEXXXOPTIMIZE注意事项
1. 注释不是越多越好
注释应该解释"为什么"而不是"是什么"。好的代码本身就能说明"是什么":
2. 避免注释掉的代码积累
不应该在代码库中保留大量被注释掉的代码。使用版本控制系统(如 Git)来管理历史代码:
3. 保持注释与代码同步
过时的注释比没有注释更糟糕。修改代码时务必同步更新注释:
4. 文档注释中的类型标注要与实际一致
最佳实践
//作为首选单行注释风格:避免与 PHP 8.0+ 属性语法#[...]冲突/** */格式:为类、方法、属性编写 phpDoc 文档下一节
在掌握了 PHP 的基本语法、标签、指令分隔符和注释之后,我们即将进入变量相关的话题。下一节将学习变量的基础概念,包括命名规则、赋值方式、类型推导和引用赋值。请阅读 变量基础。
参考链接