当前位置:首页 > PHP

php实现annotation

2026-02-28 05:58:20PHP

在PHP中实现注解(Annotation)可以通过反射(Reflection)和文档注释(DocBlock)解析来实现。以下是具体方法:

使用反射和文档注释解析

PHP原生支持通过反射获取类、方法或属性的文档注释(/ ... */),但需要手动解析注释内容。常见的做法是使用第三方库如doctrine/annotations简化流程。

安装doctrine/annotations库:

composer require doctrine/annotations

定义注解类:

php实现annotation

use Doctrine\Common\Annotations\Annotation;

/
 * @Annotation
 * @Target("METHOD")
 */
class Route {
    public $path;
    public $methods = [];
}

使用注解:

use Doctrine\Common\Annotations\AnnotationReader;

class MyController {
    /
     * @Route(path="/user", methods={"GET"})
     */
    public function getUser() {
        // 方法逻辑
    }
}

// 解析注解
$reader = new AnnotationReader();
$reflectionMethod = new ReflectionMethod('MyController', 'getUser');
$routeAnnotation = $reader->getMethodAnnotation($reflectionMethod, Route::class);

echo $routeAnnotation->path; // 输出: /user

通过PHP 8原生Attributes实现

PHP 8及以上版本原生支持Attributes(类似注解的功能),语法更简洁且性能更高。

php实现annotation

定义Attribute类:

#[Attribute(Attribute::TARGET_METHOD)]
class Route {
    public function __construct(
        public string $path,
        public array $methods = []
    ) {}
}

使用Attribute:

class MyController {
    #[Route(path: '/user', methods: ['GET'])]
    public function getUser() {
        // 方法逻辑
    }
}

// 解析Attribute
$reflectionMethod = new ReflectionMethod('MyController', 'getUser');
$attributes = $reflectionMethod->getAttributes(Route::class);

foreach ($attributes as $attribute) {
    $route = $attribute->newInstance();
    echo $route->path; // 输出: /user
}

自定义注解解析器

若需兼容旧版本或无依赖方案,可手动解析文档注释:

function parseAnnotations($docComment) {
    preg_match_all('/@(\w+)(?:\s*(?:\(\s*)?(.*?)(?:\s*\))?)?\s*(?:\n|\*\/)/', $docComment, $matches);
    $annotations = [];
    foreach ($matches[1] as $i => $name) {
        $annotations[$name] = $matches[2][$i];
    }
    return $annotations;
}

$reflection = new ReflectionMethod('MyController', 'getUser');
$annotations = parseAnnotations($reflection->getDocComment());

注意事项

  • Doctrine Annotations需PHP 7.1+,而Attributes需PHP 8.0+。
  • 文档注释注解在运行时解析,性能低于原生Attributes。
  • 复杂注解建议使用现成库(如Doctrine),避免手动解析边缘情况。

标签: phpannotation
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERV…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $imag…