当前位置:首页 > PHP

php实现annotation

2026-02-28 05:58:20PHP

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

使用反射和文档注释解析

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

安装doctrine/annotations库:

composer require doctrine/annotations

定义注解类:

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(类似注解的功能),语法更简洁且性能更高。

定义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
}

自定义注解解析器

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

php实现annotation

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实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现树

php实现树

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

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…