# 注解事件概念

我们知道事件,是一个底层的 event loop 收到消息后调用对应的各类方法的一个模型,比如给机器人发送消息后框架要做的就是指定到一个你定义的函数上,处理你的业务逻辑代码。比如在默认模块中,提供了 你好 的回复:你好啊,我是由炸毛框架构建的机器人!。这项简单回复的任务就是一个事件的触发到响应的全过程。

注解(Annotation)又称标注,Java 最早在 2004 年的 JDK 5 中引入的一种注释机制。目前 PHP 官方版本并未提供内置元注解和注解概念,但我们通过 ReflectionClass 反射类解析 PHP 代码注释从而实现了自己的一套注解机制。如果你没有写过 Java,并且不了解注解是什么,你可以理解为对 function 或 class 的一个修饰,因为传统的 PHP 代码逻辑我们都知道,不能简单给原先存在的函数贴标签,就比如,你不能在原本的 PHP 代码中给函数贴上一个可以影响它一生并且改变它行为的标签,而有了注解,就相当于有了给函数贴标签的机会。

在常见框架如 Spring,Swoft 等代码结构里面,注解更是其核心的存在。

在炸毛框架中,我们所有事件的绑定均采用这一方式进行调用模块内各个方法。包括 Swoole 自身的框架启动事件、WebSocket 连接握手事件、HTTP 请求事件等等,也包括 CQHTTP 发来的事件,如messagenoticerequest 等。

# 如何使用

就像我们日常开发写注释一样,只需在类、方法或成员变量上方按规则添加注释即可,这里以默认自带的 Hello 模块类为例子:

<?php
namespace Module\Example;
use ZM\ModBase;
use ZM\Annotation\CQ\CQCommand;
class Hello extends ModBase {
    /**
     * @CQCommand(match="你好")
     * @return string
     */
    public function hello(){
        return "你好啊,我是由炸毛框架构建的机器人!";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

其中 @CQCommand() 就是一个基本的注解应用。注意需引入相关注解(Annotation)类,且必须/** 开始并以 */ 结束,否则会导致无法解析!上方 @return 为 IDE 自动生成的 PHPDoc,不需要管。

有什么用?大有妙用!这个例子内注解类的用途是收到 QQ 消息后如果消息第一个词匹配到 你好 的话,框架就会自动处理,最终执行调用此 hello() 方法。注意 CQCommand 和其他任何后面讲到的注解类一样,需先 use ZM\Annotation\ 下的对应注解类,否则也不能正常使用。

# 基本语法

先 use!先 use!先 use!重要的事情说三遍!use ZM\Annotation\xxxx;

必须/** 开始并以 */ 结束。

@注解类名(参数名1="参数1的值"[,参数名2="参数2的值"])

对于只使用或只有一个参数的注解类,@注解类名("参数的值") 可以省略参数名。

对于没有参数的注解类,@参数名() 直接使用即可。

上次更新: 5/8/2020, 6:43:38 PM