gpt4 book ai didi

php - 您如何访问枚举案例的属性?

转载 作者:行者123 更新时间:2023-12-01 23:06:00 25 4
gpt4 key购买 nike

根据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

我可以使用那种格式,但感觉真的很笨拙,因为我几乎是在反射内部使用反射:

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) 模式看起来很奇怪。

还有其他方法可以访问我缺少的单个枚举案例属性吗?

最佳答案

#[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;
$ref = (new ReflectionClass($obj))->getReflectionConstant('ALPHA');

var_dump($ref->getAttributes()[0]->getArguments()); // alpha value
var_dump($ref->getAttributes()[0]->getName()); // TestAttribute
var_dump($ref->getName()); // ALPHA
var_dump($ref->getValue()); // enum(TestNum::ALPHA)

关于php - 您如何访问枚举案例的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70856281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com