前言
以前 并无注解功能 此功能为PHP8新增特性, 故在此记录用法
废话少说 在这里先简单概述下PHP8以前实现注解功能代码


<?php

class attributes01 {
    /**
     * @param int $a
     * @url https://blog.mzshe.cn
     * @return string
     */
    public function test($a = 0, $url = '') {
        return $url;
    }
}

$ref = new ReflectionClass(attributes01::class);
$method = $ref->getMethod('test');
$doc = $method -> getDocComment();
$url = explode(PHP_EOL, substr($doc, strpos($doc, "@url") + strlen("@url ")))[0];

$class = $ref -> newInstance();
echo $class -> test(0, $url);

如上所示 获取注解值 实际上做的是字符串操作 这样很容易出现错误

PHP8出的 Attributes 其实就是把“注释”升级为支持格式化内容的“注解” 变成PHP原生语法 这样操作起来更容易

废话少说 来看PHP8注解 如何实现


#[Attribute] // 此行是将该类 定义为注解类
class attribute02 {
    public function __construct(public string $msg)
    {}

   public function getMsg(): string {
       return $this -> msg;
   }
}


class attribute03 {
    #[attribute02('通过注解直接 实例化该类时会 调用该构造函数且包含注解上的参数\r\n')]
    public function test(attribute02 $attr) {
	var_dump($attr)
    }
}


// 通过反射获取类
$ref = new ReflectionClass(attribute03::class);

// getAttributes 是获取当前方法 所有定义的注解 返回的数组 
// getAttributes 唯一参数Name 可以指定获取注解的名称
$attr = $ref -> getMethod('test') -> getAttributes('attribute02');

// 输出获取到的注解列表
var_dump($attr);

// 实例化指定注解
$attrObject = $attr[0] -> newInstance();
// 执行注解方法
echo $attrObject -> getMsg();

// 实例化 attribute03类 并执行方法
$refObject = $ref -> newInstance();
$refObject -> test($attrObject);

PHP8 Attribute 有多种定义注解方式如下


[Attribute(Attribute::TARGET_CLASS)]

TARGET_CLASS    //类的注解类
TARGET_FUNCTION //函数注解类
TARGET_METHOD   //方法注解类
TARGET_PROPERTY //属性注解类
TARGET_CLASS_CONSTANT //类常量注解类
TARGET_PARAMETER //参数注解类
TARGET_ALL