PHP属性中使用枚举值报错,是否需提交Bug?
问题解答
这不是PHP的Bug,不需要上报,是Attribute参数的语法限制导致的。
PHP要求Attribute的参数必须是编译时常量表达式,而Types::A->value属于属性访问操作——哪怕枚举的value是只读常量,这种写法也不属于常量表达式的允许范围,因此会触发Constant expression contains invalid operations错误。
可行的解决方案
- 直接使用枚举值的字面量:
#[MyAttribute(mapping: ['a' => ''])] class Entity {} - 若想避免硬编码字面量,可借助PHP 8.1+允许直接传递枚举case作为参数值的特性调整结构,比如将映射关系的键值对调换(如果业务逻辑允许):
之后在处理Attribute时再提取#[MyAttribute(mapping: ['' => Types::A])] class Entity {}value属性即可。
需要注意的是,目前PHP的常量表达式规则暂不支持在Attribute参数的数组键中使用枚举的value属性,这是语言设计的既定限制而非Bug。
内容的提问来源于stack exchange,提问作者112Legion
相关产品推荐
相关产品推荐

