php实现annotation
在PHP中实现注解(Annotation)功能可以通过反射(Reflection)和文档注释(DocBlock)解析来实现。以下是具体方法和示例:
使用反射和文档注释解析
PHP原生支持通过反射获取类、方法或属性的文档注释(/ ... */),但需要手动解析注解内容。
/
* @Annotation
* @Target("METHOD")
*/
class Route {
public $path;
public $methods = [];
}
class MyController {
/
* @Route(path="/user", methods={"GET"})
*/
public function getUser() {
// 方法逻辑
}
}
使用第三方库
推荐使用成熟的注解解析库,如doctrine/annotations:
use Doctrine\Common\Annotations\AnnotationReader;
$reader = new AnnotationReader();
$reflectionMethod = new ReflectionMethod('MyController', 'getUser');
$routeAnnotation = $reader->getMethodAnnotation($reflectionMethod, Route::class);
echo $routeAnnotation->path; // 输出 "/user"
自定义注解处理器
可以通过反射和正则表达式实现简单的注解解析:
function parseAnnotations($docComment) {
preg_match_all('/@([A-Za-z]+)\(([^)]*)\)/', $docComment, $matches);
$annotations = [];
foreach ($matches[1] as $i => $name) {
$annotations[$name] = eval("return [{$matches[2][$i]}];");
}
return $annotations;
}
$docComment = (new ReflectionMethod('MyController', 'getUser'))->getDocComment();
$annotations = parseAnnotations($docComment);
PHP 8原生注解
PHP 8引入了原生注解(Attributes),语法更简洁:

#[Attribute]
class Route {
public function __construct(public string $path, public array $methods = []) {}
}
class MyController {
#[Route(path: '/user', methods: ['GET'])]
public function getUser() {
// 方法逻辑
}
}
$reflectionMethod = new ReflectionMethod('MyController', 'getUser');
$routeAttribute = $reflectionMethod->getAttributes(Route::class)[0]->newInstance();
echo $routeAttribute->path; // 输出 "/user"
注意事项
- 文档注释注解需通过反射获取后手动解析,性能较低
- PHP 8的Attributes是编译时处理,性能更好
- 复杂场景建议使用
doctrine/annotations等成熟库
以上方法可根据项目需求选择,PHP 8+项目推荐直接使用原生Attributes。






