php实现注解
在PHP中实现注解(Annotation)可以通过多种方式完成,以下是一种常见的方法:
使用反射和DocBlock解析
PHP原生支持通过反射获取类、方法或属性的文档注释(DocBlock),结合第三方库(如doctrine/annotations)可以解析注解。
安装依赖库:
composer require doctrine/annotations
定义注解类:
use Doctrine\Common\Annotations\Annotation;
/
* @Annotation
* @Target("METHOD")
*/
class Route {
public $path;
public $methods = [];
}
使用注解:
class MyController {
/
* @Route(path="/user", methods={"GET"})
*/
public function getUser() {
// 方法逻辑
}
}
解析注解:
use Doctrine\Common\Annotations\AnnotationReader;
$reader = new AnnotationReader();
$reflectionMethod = new ReflectionMethod('MyController', 'getUser');
$routeAnnotation = $reader->getMethodAnnotation($reflectionMethod, Route::class);
echo $routeAnnotation->path; // 输出: /user
使用原生PHP8 Attributes
PHP8原生支持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
}
自定义注解解析方案
如需更轻量级的方案,可以自行解析DocBlock:
function parseAnnotations(string $docComment): array {
preg_match_all('/@(\w+)(?:\s*(?:\(\s*)?(.*?)(?:\s*\))?)?\s*(?:\n|\*\/)/', $docComment, $matches);
$annotations = [];
foreach ($matches[1] as $i => $name) {
$annotations[$name] = $matches[2][$i] ?? true;
}
return $annotations;
}
$docComment = (new ReflectionMethod('MyController', 'getUser'))->getDocComment();
$annotations = parseAnnotations($docComment);






