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
基本一致, 后面如果封装一些组件的话, 应该能用得上.
爱站程序员基地


