PHP8的注解

PHP技术
473
0
0
2023-07-27
标签   PHP8

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

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

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

到了 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之前, 通过注释其实也能够实现同样的功能. 但是相比注解, 注释有几点不足:

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

库注解

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

Immutable

命名空间: JetBrains\PhpStorm

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

ArrayShape

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

Deprecated

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

ExpectedValues

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

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

Language

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

NoReturn

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

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

Pure

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

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