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[]->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
标记函数调用过程对结果没有影响, 简单说就是, 如果函数的返回值没有使用, 那就可以安全的删除这个函数调用.
最后, 发现已经定义的注解, 都是给编译器使用的.