php 实现注解
PHP 注解实现方法
PHP 本身不直接支持注解(Annotation),但可以通过反射(Reflection)和文档注释(DocBlock)结合第三方库实现类似功能。以下是几种常见实现方式:
使用 Doctrine Annotations 库
Doctrine Annotations 是 PHP 中最流行的注解实现库之一。
安装依赖:
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="/users", methods={"GET"})
*/
public function listUsers() {
// ...
}
}
读取注解:
$reflectionMethod = new ReflectionMethod(MyController::class, 'listUsers');
$reader = new AnnotationReader();
$route = $reader->getMethodAnnotation($reflectionMethod, Route::class);
echo $route->path; // 输出 "/users"
使用 PHP 8+ 原生 Attributes
PHP 8 引入了原生属性(Attributes)功能,可以替代传统注解。
定义属性:

#[Attribute(Attribute::TARGET_METHOD)]
class Route {
public function __construct(
public string $path,
public array $methods = []
) {}
}
使用属性:
class MyController {
#[Route(path: '/users', methods: ['GET'])]
public function listUsers() {
// ...
}
}
读取属性:
$reflectionMethod = new ReflectionMethod(MyController::class, 'listUsers');
$attributes = $reflectionMethod->getAttributes(Route::class);
foreach ($attributes as $attribute) {
$route = $attribute->newInstance();
echo $route->path; // 输出 "/users"
}
自定义解析 DocBlock
如果不想依赖第三方库,可以手动解析文档注释:
class RouteAnnotationParser {
public static function parse(string $docComment): ?array {
if (!preg_match('/@Route\((.+?)\)/s', $docComment, $matches)) {
return null;
}
$params = [];
if (preg_match('/path\s*=\s*"([^"]+)"/', $matches[1], $pathMatch)) {
$params['path'] = $pathMatch[1];
}
if (preg_match('/methods\s*=\s*{([^}]+)}/', $matches[1], $methodsMatch)) {
$params['methods'] = array_map('trim', explode(',', $methodsMatch[1]));
}
return $params;
}
}
性能优化建议
使用 Doctrine Annotations 时考虑启用缓存:
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\ArrayCache;
$reader = new AnnotationReader();
$reader = new CachedReader($reader, new ArrayCache());
对于 PHP 8+ 项目,原生 Attributes 性能更好,推荐优先使用。






