【Hyperf 入门到精通】注解 01

注解 Annotation / Attribute

PHP8 之前注解称之为Annotation
使用doctrine/annotations组件, 通过特定文本格式@Class解析内容, 已经淘汰这里不展开

1
2
3
4
5
6
7
8
9
10

use Hyperf\HttpServer\Annotation\Controller;

/**
* @Controller(...)
*/
class IndexController
{

}

PHP8 之后注解称之为Attribute, PHP 官方提供, 使用方便, 性能优秀, 格式为#[Class]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

use Hyperf\HttpServer\Annotation\Controller;

#[Controller(prefix: '/index')]
class IndexController
{

}

# 反射获取属性
$reflectionClass = new ReflectionClass(IndexController::class);
$attributes = $reflectionClass->getAttributes();
foreach ($attributes as $attribute) {
print_r([$attribute->getName(), $attribute->getArguments()]);
}

官方介绍:

Attribute 提供了在代码中的声明上添加结构化、机器可读的元数据信息的能力:类、方法、函数、参数、属性和类常量可以是Attribute 的目标。然后可以使用反射 API在运行时检查Attribute 定义的元数据 。因此,Attribute 可以被认为是直接嵌入到代码中的配置语言。

注解可以简单理解为, 写死在代码(类、方法、函数、参数、属性和类常量)上的配置项

自定义一个Attribute

1
2
3
4
5
6
7
8
9
10

use Attribute;

#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
class Message
{
public function __construct(public string $text)
{
}
}

可以实现一个简易版枚举类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use Message;

class ErrorCode
{
#[Message('成功')]
public const SUCCESS = 0;

#[Message('系统参数错误')]
public const ERROR = 1;

public static function getMessage(int $code): string
{
$reflectionClass = new ReflectionClass(ErrorCode::class);
$constants = $reflectionClass->getReflectionConstants();
foreach ($constants as $constant) {
if ($constant->getValue() === $code) {
$attributes = $constant->getAttributes(Message::class);
return $attributes[0]->newInstance()->text;
}
}
return '';
}
}
echo ErrorCode::getMessage(ErrorCode::SUCCESS);

注意, Hyperf 自带的一些注解, 功能强大, 比如:

  1. Inject
  2. Controller
  3. Cacheable

但这是因为AOP 的强大, 并非注解强大, 后面介绍AOP