PHP8的注解
PHP8.0
增加了注解的支持, 虽然 PHP
的注解没用过, 但是咱用过JAVA
的注解呀.
注解这玩意怎么用? 简单说就下面几步:
- 定义注解类
- 使用注解
- 提取注解
到了PHP
中, 也基本上换汤不换药.
使用#
定义注解类
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_FUNCTION)]
class MyAttribute{
private $value;
public function __construct($value){
$this->value = $value;
}
}
这就定义完了, 其中Attrbute
用来标识当前注解可以用在什么地方.
使用注解
#[MyAttribute('test')]
function test(){
}
提取注解
同样, 也是通过反射来提取注解.
// 获取方法的反射对象
$ref = new ReflectionFunction("test");
// 获取方法上指定名称的全部注解(可以定义多个, 所以返回值是个数组)
$attributes = $ref->getAttributes(MyAttribute::class);
// 将获取的第一个值实例化. 此时会调用注解的构造方法
$myAttribute = $attributes[0]->newInstance();
简单使用就这样了. 问了, 注解有什么用? 想想JAVA
中怎么用的, 基本差不多吧. 比如框架的自动注入, 定义一个路径, 在加载的时候扫描路径下的所有文件, 提取出对应的注解.
注释#
在8.0之前, 通过注释其实也能够实现同样的功能. 但是相比注解, 注释有几点不足:
- 没有编译器提示. 容易打错名字, 参数等等
- 容易误删. 毕竟注释默认为是不影响代码逻辑的
- 缺少运行时检查. 就算你写错了, 也能正常运行, 可能会导致隐藏的 bug
- 注释的解析缺少语言支持.
而注解就是升级后的语言层面注释, 较之前方便了许多
库注解#
记录一些系统已经定义好的注解, 但是发现没有找到文档. 么事, 全局搜索使用了Attribute
的地方就好啦.
Immutable
命名空间: JetBrains\PhpStorm
将一个类的属性标记为不可修改的. (写在类上则标识类的所有属性). 但是这个注解只是加给phpStorm
看的, 运行时并不会报错.

ArrayShape
告诉 IDE 返回的数组中都有什么类型, 方便 IDE 提示(IDE 使用)

Deprecated
弃用标识(IDE 使用). 和原本的启用注释类似. 不过可以提示新的函数.

ExpectedValues
标识期望得到的值(IDE 使用). 指定可能的值列表, 二进制位, 类常量等等.
例如Attribute
类构造方法的使用:
Language
(IDE 使用) 说是能提示参数是某个语言的字符串(如 SQL), 研究半天没懂动有什么用.
NoReturn
(IDE 使用) 标记调用函数时, 会结束执行, 就像调用exit
函数一样.
其参数可以指定, 仅当接收指定常量参数时才退出.
Pure
标记函数调用过程对结果没有影响, 简单说就是, 如果函数的返回值没有使用, 那就可以安全的删除这个函数调用.
最后, 发现已经定义的注解, 都是给编译器使用的.
简单上手之后, 发现和JAVA
基本一致, 后面如果封装一些组件的话, 应该能用得上.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY