首页 > 解决方案 > PHP 8 重复属性的错误:是否可以多次使用属性?

问题描述

我有一个属性如下:

#[Attribute]
class State{
    public function __constractor(
        public string $name
    ){}
}

我想在我的类中添加多个状态,如下所示:

#[
   State('a'),
   State('b')
]
class StateMachine{}

一切正常,我可以访问属性列表如下:

$attrs = $classReflection->getAttributes(State::class);

但问题是,每当我尝试即时其中一个时,都会引发错误:

$instance = $attrs[0]->newInstance();

错误是:

Error: Attribute "State" must not be repeated

任何想法?

标签: phpannotationsphp-8

解决方案


根据官方文档,您必须以不同的方式定义属性才能这样做。我使用 PHPStorm 来验证我的假设,这应该有效:

定义属性

use Attribute;

#[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_CLASS)]
class State{
    public function __construct(
        public string $name
    ){}
}

这里重要的部分是Attribute::IS_REPEATABLE定义。要使其适用于类,您还需要使用Attribute::TARGET_CLASS.

根据文档,在应用属性时,您还应该将所有内容放在一行中:

#[State('a'), State('b')]
class StateMachine{}

推荐阅读