PHP 8.0中是否支持将annotations注解与attributes属性结合使用
结论
完全可以,这种混合写法是合法且能正常运行的。
原理说明
PHP 8.0 引入原生属性(Attribute)语法后,传统的 DocBlock 注解(Annotation)和原生属性是两套独立的解析逻辑,互不干扰:
- 传统注解的解析器只会读取DocBlock注释块内对应格式的标记,不会识别PHP原生的
#[...]属性语法 - 原生属性的解析器只会读取
#[...]包裹的内容,不会处理注释块里的内容
你给出的示例里,@Gedmo\Timestampable是gedmo/doctrine-extensions库提供的传统注解,#[ORM\Column]是Doctrine ORM 2.9及以上版本支持的原生属性,二者分别由各自的扩展解析,完全不会冲突。
补充说明
如果后续你想要统一语法的话,只要你使用的gedmo/doctrine-extensions版本不低于v3.5,也可以直接把二者都写成原生属性形式:
#[Gedmo\Timestampable(on: 'create')] #[ORM\Column(type: 'datetime')] private ?DateTime $createdAt; // 也可以合并成一行书写 #[Gedmo\Timestampable(on: 'create'), ORM\Column(type: 'datetime')] private ?DateTime $createdAt;
不过即使不做修改,你原本的混合写法也可以正常工作,不需要额外调整。
内容的提问来源于stack exchange,提问作者M. Mustafa Eyvaz
相关产品推荐
相关产品推荐

