根据RFC on Enumerations,可以通过使用将属性添加到案例中Attribute::TARGET_CLASS_CONSTANT
。(实际上,RFC 说TARGET_CLASS_CONST
,但这要么是错字,要么是后来的更改。)但是,我在尝试使用反射访问它们时遇到了麻烦。
鉴于此设置:
#[Attribute(Attribute::TARGET_CLASS_CONSTANT)]
class TestAttribute
{
public function __construct(public string $value)
{
}
}
enum TestNum
{
#[TestAttribute('alpha value')]
case ALPHA;
#[TestAttribute('beta value')]
case BETA;
}
我希望下面的代码给我一个具有单个属性的数组,但是它返回一个空数组。
$obj = TestNum::ALPHA;
$reflection = new ReflectionClass($obj);
$classAttributes = $reflection->getAttributes(TestAttribute::class);
var_dump($classAttributes);
此处演示:https ://3v4l.org/uLDVQ#v8.1.2
我在PHP src中找到了一个测试用例,但是用法不是我所期望的。我需要分解它,而不是使用实例:
var_dump((new \ReflectionClassConstant(TestNum::class, 'ALPHA'))->getAttributes(TestAttribute::class)[0]->newInstance());
此处演示:https ://3v4l.org/BsA9r#v8.1.2
我可以使用这种格式,但感觉真的很hacky,因为我几乎在反射中使用反射:
var_dump((new \ReflectionClassConstant($obj::class, $obj->name))->getAttributes(TestAttribute::class)[0]->newInstance());
此处演示:https ://3v4l.org/YY6Oa#v8.1.2
具体来说,该new \ReflectionClassConstant($obj::class, $obj->name)
模式似乎奇怪的样板。
是否有另一种方法可以访问我缺少的单个枚举案例属性?