Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 避免在多对多对象关系上使用循环引用_Php_Oop_Cyclic Reference - Fatal编程技术网

Php 避免在多对多对象关系上使用循环引用

Php 避免在多对多对象关系上使用循环引用,php,oop,cyclic-reference,Php,Oop,Cyclic Reference,在处理多项选择练习的应用程序中,我面临一些对象关系问题 考虑到这些练习,我可以: 1-我有几个练习,有几个问题,有几个备选方案。 2-一个具体问题可以是多个练习的一部分。 3-特定的备选方案不能是几个问题的一部分 在关系方面: 练习问题 问题备选方案 我按照下面的方式对这些类进行编码: class Exercise { private $id; private $name; private $questions = []; //array of ExerciseQuest

在处理多项选择练习的应用程序中,我面临一些对象关系问题

考虑到这些练习,我可以:

1-我有几个练习,有几个问题,有几个备选方案。 2-一个具体问题可以是多个练习的一部分。 3-特定的备选方案不能是几个问题的一部分

在关系方面:

练习问题
问题<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!按照您建议的方式重构后,代码看起来更干净。