PHP 8中Doctrine属性能否继承?非实体类属性继承疑问
关于Doctrine实体与PHP 8属性继承的问题解答
1. 使用属性而非注解的Doctrine实体能否实现继承?
完全可以。Doctrine ORM从2.9版本开始就全面支持PHP 8属性,包括各类实体继承场景(单表继承、类表继承、映射超类等),用法逻辑和注解完全一致,只是把注解语法替换成属性语法即可。
举个映射超类的继承示例:
use Doctrine\ORM\Mapping as ORM; #[ORM\MappedSuperclass] abstract class BaseEntity { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] protected int $id; #[ORM\Column(type: 'datetime')] protected \DateTimeInterface $createdAt; } #[ORM\Entity] class Post extends BaseEntity { #[ORM\Column(type: 'string')] private string $title; // 子类自动继承父类的id和createdAt字段映射 }
不管是单表继承(搭配#[InheritanceType('SINGLE_TABLE')])还是类表继承,都可以用属性替代注解实现,Doctrine会正常识别继承关系中的属性映射规则。
2. 非Doctrine实体类中的PHP 8属性能否被继承?
可以。PHP 8的属性本身支持继承,具体规则和类成员的继承逻辑一致:
- 父类中
public或protected的属性,子类会自动继承其对应的PHP 8属性标记; - 父类中
private的属性,子类无法继承(私有成员本身不参与继承链); - PHP 8.1及以上版本中,若子类需要重写父类的属性,建议用
#[Override]属性明确标记,避免意外覆盖引发的警告。
示例:
#[Attribute] class MyCustomAttribute {} class ParentClass { #[MyCustomAttribute] protected string $name; } class ChildClass extends ParentClass { // 子类继承了$name属性,同时也继承了它的#[MyCustomAttribute]标记 }
内容的提问来源于stack exchange,提问作者Zeljko Miloradovic
相关产品推荐
相关产品推荐

