注解,简而言之,就是解析注释中的一些东西,获得一个结构化的结果,用来实现一些操作。
DOF 大量使用了注解,来实现路由、实体、仓库、ORM 等的功能定义和关联。
组成元素
注解标识符号/基本格式:
@Annotation(...){...}
。注解名称/KEY:
Annotation
中就是注解名,只能由英文字母和数字组成。注解值:
(...)
中的...
就是注解值。注解参数/附加选项:
{...}
中的...
就是注解附加选项,注解附加选项内部格式是 URL Query String 风格的格式,比如a=b&c=d
。
正则表达式描述
#@([a-zA-z\d]+)\((.*)\)(\{(.*)\})?#
例子
@Route(users)
@Argument(id){need:1&min:1=ID必须是正整数}
@HeaderStatus(201){创建成功}
@Type(Bint)
@Entity(Domain\User\Entity\User)
@Implementor(Domain\User\Storage\MySQL\UserORM)
存在位置
注解只能存在与 DocComment 风格的代码注释中的某一行。即:
/**
* @Route(users)
* @Verb(GET)
*/
public function list()
{
// ...
}
更进一步细分,根据注解存在类文件中注释的位置还可以把注解分类为:类注解、类属性注解、类方法注解。
而且一般情况下,除非特殊说明,类属性和类方法均可继承类的注解。
优缺点
优点:以声明式编程风格去定义一些逻辑想要达到的目标、两个目标的关系等,可以大量减少重复业务代码的编写。
优点:方便自动化,包括了接口文档自动化、数据库 Schema 自动同步。
优点:方便实现抽象的依赖注入。
缺点:注解需要编译成 PHP 能识别的结构,因此需要牺牲一些性能。不过部署的时候可以事先编译好,以跳过编译过程。