Php 避免在多对多对象关系上使用循环引用
在处理多项选择练习的应用程序中,我面临一些对象关系问题 考虑到这些练习,我可以: 1-我有几个练习,有几个问题,有几个备选方案。 2-一个具体问题可以是多个练习的一部分。 3-特定的备选方案不能是几个问题的一部分 在关系方面: 练习Php 避免在多对多对象关系上使用循环引用,php,oop,cyclic-reference,Php,Oop,Cyclic Reference,在处理多项选择练习的应用程序中,我面临一些对象关系问题 考虑到这些练习,我可以: 1-我有几个练习,有几个问题,有几个备选方案。 2-一个具体问题可以是多个练习的一部分。 3-特定的备选方案不能是几个问题的一部分 在关系方面: 练习问题 问题备选方案 我按照下面的方式对这些类进行编码: class Exercise { private $id; private $name; private $questions = []; //array of ExerciseQuest
问题<1-n>备选方案 我按照下面的方式对这些类进行编码:
class Exercise {
private $id;
private $name;
private $questions = []; //array of ExerciseQuestion
//...
}
class ExerciseQuestion {
private $id;
private $exercise = new Exercise();
private $question = new Question();
private $order; //handles question's order of appearance
//...
}
class Question {
private $id;
private $wording;
//...
}
class Alternative {
private $id;
private $question = new Question();
private $text;
//...
}
我不知道我是否这样做了,但是,我不是在类属性中存储关系ID,而是存储相关类的实例。当我开始时,这似乎是正确的方法
我预见到的问题是,在关系练习问题中,我将陷入循环引用的地狱。我会有一个练习,有几个练习题,里面有很多练习题。我的假设正确吗
有没有更好或正确的方式来表达这种关系?我应该改为存储ID而不是实例,还是可以利用一些设计模式?如果我读对了,你实际上没有问题。如果您的域包含循环或自引用关系,那么您的模型也应该包含循环或自引用关系 由于您的对象是实体(它们具有标识),因此您需要注意每个id只存在一个实例。但只要您强制执行该操作,它们就可以根据需要相互引用
现在,如果需要以某种详尽的方式遍历对象图,那么循环引用可能很难处理。在这种情况下,你需要注意不要让自己陷入无休止的循环。但是,如果您的域实际上具有这些关系,那么您需要对它们进行建模,并且您必须实现某种方法来检测周期并处理它们。详细信息将根据您的特殊需要提供。如果我没有看错,您实际上没有问题。如果您的域包含循环或自引用关系,那么您的模型也应该包含循环或自引用关系 由于您的对象是实体(它们具有标识),因此您需要注意每个id只存在一个实例。但只要您强制执行该操作,它们就可以根据需要相互引用
现在,如果需要以某种详尽的方式遍历对象图,那么循环引用可能很难处理。在这种情况下,你需要注意不要让自己陷入无休止的循环。但是,如果您的域实际上具有这些关系,那么您需要对它们进行建模,并且您必须实现某种方法来检测周期并处理它们。详细信息将根据您的特殊需要提供。我不确定是否理解您的意思,但如果您问:这是一个循环引用问题吗?答案是肯定的或否定的,这取决于你将要做什么以及你如何处理你的问题。 但是,如果您谈论的是您的实现,那么答案肯定是否定的,因为class属性不存储“一个对象”,而是“一个对象的引用”,因此在您的情况下,没有循环构造会导致无限递归迭代
祝你好运我不确定我是否理解你的意思,但如果你问:这是循环引用有问题吗?答案是肯定的或否定的,这取决于你将要做什么以及你如何处理你的问题。 但是,如果您谈论的是您的实现,那么答案肯定是否定的,因为class属性不存储“一个对象”,而是“一个对象的引用”,因此在您的情况下,没有循环构造会导致无限递归迭代
祝你好运,你的模型有问题。关系对象应仅存储关系中涉及的部分的id、练习id和问题id,以及应用于这两个实体的关系的任何附加属性,如顺序。您不会实例化关系对象中涉及的实体 准确地说,你的ER模型是这样的
Exercise (id, name)
Question (id, wording)
ExerciseQuestion (exercise_id, question_id, order) // both ids
// form primary key
Alternative (id, text, question_id)
你的课程应该遵循这个原则。你的模型有问题。关系对象应仅存储关系中涉及的部分的id、练习id和问题id,以及应用于这两个实体的关系的任何附加属性,如顺序。您不会实例化关系对象中涉及的实体 准确地说,你的ER模型是这样的
Exercise (id, name)
Question (id, wording)
ExerciseQuestion (exercise_id, question_id, order) // both ids
// form primary key
Alternative (id, text, question_id)
你的课程应该遵循这一点。谢谢你的帮助@timdev。我相信在这种情况下,我不应该有循环引用,因为流程似乎总是自上而下的:练习>>练习问题>>问题>>备选方案。你有什么建议可以让我改进设计吗?如果你不需要改变方向,你可以完全消除这个问题。练习可以有一系列有序的问题。数据库中的每个表都不需要实体。谢谢@timdev!按照您建议的方式重构后,代码看起来更干净。感谢您的帮助@timdev。我相信在这种情况下,我不应该有循环引用,因为流程似乎总是自上而下的:练习>>练习问题>>问题>>备选方案。你有什么建议可以让我改进设计吗?如果你不需要改变方向,你可以完全消除这个问题。练习可以有一系列有序的问题。数据库中的每个表都不需要实体。谢谢@timdev!按照您建议的方式重构后,代码看起来更干净。