PHP 注解
PHP 8 引入了注解功能,为代码中的类、方法、函数、属性等提供了声明式、结构化的元数据。通过注解,可以在代码中直接嵌入配置数据,并在运行时通过反射机制动态访问这些信息。这种设计提高了灵活性,使功能模块解耦,简化了配置管理。
注解的语法
• 注解使用 #[…] 包裹,其内部可以包含多个注解,多个注解用逗号分隔。
• 通常会为注解创建一个类,并在类上使用内置的 #[Attribute] 注解标记该类为一个有效的注解。
<?php
#[Attribute]
class Example {
public string $message;
public function __construct(string $message) {
$this->message = $message;
}
}
#[Example("This is a demo class.")]
class Demo {
#[Example("This is a demo property.")]
public string $property;
#[Example("This is a demo method.")]
public function method() {}
}
?>
使用反射获取注解
通过反射机制,可以读取注解并获取它的元数据内容。
<?php
// 定义注解类
#[Attribute]
class Example {
public string $message;
public function __construct(string $message) {
$this->message = $message;
}
}
// 定义一个带注解的类
#[Example("This is a demo class.")]
class Demo {
#[Example("This is a demo property.")]
public string $property;
#[Example("This is a demo method.")]
public function method() {}
}
// 通过反射获取注解信息
$reflectionClass = new ReflectionClass(Demo::class);
$classAttributes = $reflectionClass->getAttributes();
echo "Class Annotations:\n";
foreach ($classAttributes as $attribute) {
$instance = $attribute->newInstance();
echo $instance->message . PHP_EOL;
}
$reflectionMethod = $reflectionClass->getMethod('method');
$methodAttributes = $reflectionMethod->getAttributes();
echo "\nMethod Annotations:\n";
foreach ($methodAttributes as $attribute) {
$instance = $attribute->newInstance();
echo $instance->message . PHP_EOL;
}
?>
输出结果:
Class Annotations:
This is a demo class.
Method Annotations:
This is a demo method.
注解的功能依赖于反射 API,对性能敏感的场景需谨慎使用。