You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:40:42