PHP8的注解

2021-02-04 11:43:17 浏览数 (1)

PHP8.0增加了注解的支持, 虽然 PHP的注解没用过, 但是咱用过JAVA的注解呀.

注解这玩意怎么用? 简单说就下面几步:

  1. 定义注解类
  2. 使用注解
  3. 提取注解

到了PHP中, 也基本上换汤不换药.

使用

定义注解类

代码语言:javascript复制
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_FUNCTION)]
class MyAttribute{
    private $value;
    public function __construct($value){
        $this->value = $value;
    }
}

这就定义完了, 其中Attrbute用来标识当前注解可以用在什么地方.

使用注解

代码语言:javascript复制
#[MyAttribute('test')]
function test(){

}

提取注解

同样, 也是通过反射来提取注解.

代码语言:javascript复制
// 获取方法的反射对象
$ref = new ReflectionFunction("test");
// 获取方法上指定名称的全部注解(可以定义多个, 所以返回值是个数组)
$attributes = $ref->getAttributes(MyAttribute::class);
// 将获取的第一个值实例化. 此时会调用注解的构造方法
$myAttribute = $attributes[0]->newInstance();

简单使用就这样了. 问了, 注解有什么用? 想想JAVA中怎么用的, 基本差不多吧. 比如框架的自动注入, 定义一个路径, 在加载的时候扫描路径下的所有文件, 提取出对应的注解.

注释

在8.0之前, 通过注释其实也能够实现同样的功能. 但是相比注解, 注释有几点不足:

  1. 没有编译器提示. 容易打错名字, 参数等等
  2. 容易误删. 毕竟注释默认为是不影响代码逻辑的
  3. 缺少运行时检查. 就算你写错了, 也能正常运行, 可能会导致隐藏的 bug
  4. 注释的解析缺少语言支持.

而注解就是升级后的语言层面注释, 较之前方便了许多

库注解

记录一些系统已经定义好的注解, 但是发现没有找到文档. 么事, 全局搜索使用了Attribute的地方就好啦.

Immutable

命名空间: JetBrainsPhpStorm

将一个类的属性标记为不可修改的. (写在类上则标识类的所有属性). 但是这个注解只是加给phpStorm看的, 运行时并不会报错.

ArrayShape

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

Deprecated

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

ExpectedValues

标识期望得到的值(IDE 使用). 指定可能的值列表, 二进制位, 类常量等等.

例如Attribute类构造方法的使用:

Language

(IDE 使用) 说是能提示参数是某个语言的字符串(如 SQL), 研究半天没懂动有什么用.

NoReturn

(IDE 使用) 标记调用函数时, 会结束执行, 就像调用exit函数一样.

其参数可以指定, 仅当接收指定常量参数时才退出.

Pure

标记函数调用过程对结果没有影响, 简单说就是, 如果函数的返回值没有使用, 那就可以安全的删除这个函数调用.

最后, 发现已经定义的注解, 都是给编译器使用的.


简单上手之后, 发现和JAVA基本一致, 后面如果封装一些组件的话, 应该能用得上.

0 人点赞