php实现annotation
在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
}
自定义注解解析器
若需兼容旧版本或无依赖方案,可手动解析文档注释:
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),避免手动解析边缘情况。






