Doctrine orm Symfony项目应该如何在其实体类中实现UML2类接口?

Doctrine orm Symfony项目应该如何在其实体类中实现UML2类接口?,doctrine-orm,interface,uml,symfony,Doctrine Orm,Interface,Uml,Symfony,在阅读了关于如何构建UML类图和使用UML类图的内容之后,我尝试为我即将开始的新Symfony项目构建一个我很满意的UML类图 但是,对于我定义的接口,例如: 我不清楚它们是否应该/如何作为Symfony抽象实体实现。从我所读到的内容来看,似乎有相互矛盾的观点: 然而,这似乎只是为了从其他bundle访问抽象类 人们建议不要使用抽象类,不要创建“正常”实体(即教授和学生)——尽管这不是忽视了实体的好处吗 你应该看看条令文档的一节。。。它允许你有一个抽象的“人”类,然后扩展它,使之成为一个“学生

在阅读了关于如何构建UML类图和使用UML类图的内容之后,我尝试为我即将开始的新Symfony项目构建一个我很满意的UML类图

但是,对于我定义的接口,例如:

我不清楚它们是否应该/如何作为Symfony抽象实体实现。从我所读到的内容来看,似乎有相互矛盾的观点:

  • 然而,这似乎只是为了从其他bundle访问抽象类

  • 人们建议不要使用抽象类,不要创建“正常”实体(即教授和学生)——尽管这不是忽视了实体的好处吗


  • 你应该看看条令文档的一节。。。它允许你有一个抽象的“人”类,然后扩展它,使之成为一个“学生”或“老师”。有几种不同的方法可以实现这一点。。。其中最简单的是
    SINGLE_TABLE
    继承,它使用数据库中的“discriminator”来了解实体的类型。

    您的类似乎表示普通(业务)对象类型,如表示应用程序数据模型的UML类图中所定义。在您的示例中,考虑根类<代码>人>代码>的类层次结构是很自然的,在数据模型中有两个子类:代码>教授< /C> >和<代码>学生>代码>。现在,当您必须在某个框架中实现这样的数据模型(具有子类和/或类之间的关系/关联)时,问题是如何定义相应的模型类(也称为“实体类”),答案取决于框架对这些概念的支持

    通常,当您必须在应用程序中处理类层次结构,并且OO框架支持模型/实体类之间的继承/专门化时,主要问题是如何将类层次结构映射到底层SQL DBMS中的一组表,作为对象关系映射(ORM)的一部分

    在数据模型中,您不会使用接口,因为它们是OO编程概念,而不是数据语义概念。但是,在数据模型中,可以将Person定义为抽象类,这意味着它没有任何直接实例,其唯一目的是定义由子类继承的特性(属性、方法和约束)。顺便说一句,这个假设/决定意味着除了学生和教授之外,没有其他的
    人的例子

    如果您的框架(例如Symfony)不支持从抽象类继承,而是支持某种形式的接口,那么您可以使用接口来获得类似于只定义抽象方法的抽象类的东西。接口
    Person
    将为
    firstname
    lastName
    定义getter/setter


    由于在许多情况下,以及在您的简单示例中,给定的类层次结构非常简单,因此最好消除子类关系,并使用。这避免了定义接口和维护接口与实现接口的类之间的关系所带来的所有开销。这相当于将类层次结构保留在模型/实体类中,并使用单表继承ORM模式。

    我认为,这是垃圾(很抱歉这么说)。人是没有接口的。这是一个简单的(可能是抽象的)类。接口需要方法,而不是属性,因为它提供了功能。感谢您的帮助。这只是一个基本的图表,让大家了解我的想法,但在我的实际案例中,我也有“Person”的方法。那么说接口是“抽象类+方法”对吗?我想你可以这样说:-)谢谢-映射的超类在数据模型方面看起来是正确的-但是正如@Thomas Kilian指出的,我选择的图像不是最好的,因为它没有显示任何方法(我需要处理)。这些方法是否应该在一个新文件
    person.php
    中指定,该文件指定了我的抽象类,然后将实际的实体(例如Professor和Student)作为不同的文件,例如
    Professor.php
    使用
    class Professor extensed person{…}
    @Bendy,这是正确的。。。Person类是一个抽象类。。。它不能被实例化。。。所以你总是要扩展它,这样你才能使用它。。。所以你将有3个文件。。。Person.php Professor.php和Student.php。。。