我的对象包含多个自身实例,我应该关注吗?

时间:2012-09-28 12:26:54

标签: php oop object multiple-instances

我有两个班级,QuizQuestion

class Quiz()
{

    public $quiz_id;
    public $quiz_name;

    // Arrays of objects
    public $questions;
    public $personalities;

    function __construct($quiz_id)
    {
        // Sets the basic data of the quiz
        $this->quiz_id = $quiz_id;
        $this->quiz_name = $quiz_name_from_db;
    }

    function LoadQuestions()
    {
        // Get question ids from database

        // Blank array to add questions to 
        $array_of_question_objects = array();

        foreach ($question_from_db AS $question_info)
        {

            // Create Question object, passing this Quiz object 
            $question_object = new Question($question_info["question_id"], $this);

            // Add the question to the array
            $array_of_question_objects += $question_object;

        }

        // Set the array within the Quiz object
        $this->questions = $array_of_question_objects;
    }

    function LoadPersonalities()
    {
        $this->personalities = $array_of_personalty_objects;
    }
}

class Question()
{

    public $question;

    // Quiz object within the question for access to personalities and quiz type
    private $quiz_object;

    function __construct($question_id, $quiz_object)
    {
        // Set the quiz object within the question
        $this->quiz_object;

        // Load the question information from the database and set the values of the class
        $this->question = $question_from_database;
    }


    function ShowQuestion()
    {
        // Show a question on the page and also
        // Loop through all of the personalities

        echo "<div id="question">";


        if ($quiz_object->quiz_type == "personality")
        {
            foreach ($quiz_object->personalities AS $quiz_personality)
            {

                // Show each personality
                echo $quiz_personality;
            }
        }
    }
}

如您所见,我需要让我的问题对象访问我的Quiz对象值:$quiz_type$personalities

如果我想加载所有问题及其可能的个性结果,我将使用以下代码:

$quiz_id = 1;

// Create a quiz object
$quiz_object = new Quiz($quiz_id);

// Load the questions in to the Quiz object
$quiz_object->LoadQuestions();

// Load all of the personalities
$quiz_object->LoadPersonalities();

// Show the questions
foreach ($quiz_object->questions AS $question)
{
    // Show the question
    $question->ShowQuestion();
}

如果我只想显示一个问题(以及所有个性信息),我可以使用以下代码:

$quiz_id = 1;
$question_id = 40;

// Create a quiz object
$quiz_object = new Quiz($quiz_id);

// Load all of the personalities for the quiz object
$quiz_object->LoadPersonalities();

// Load the question as an object
$question_object = new Question($question_id, $quiz_object);

// Show the HTML for the question
$question_object->ShowQuestion();

我担心我的每个问题对象都需要来自Quiz对象的信息才能运行

当我将所有问题对象加载到我的测验中时(使用$ quiz_object-&gt; LoadQuestions),我的测验对象基本上包含问题信息以及本身的实例多次每个问题的测验。

所以它看起来有点像

  

Quiz_object {

Question_object:
{
    question information
    instance of `Quiz_object`
}

Question_object:
{
    question information
    instance of `Quiz_object`
}

Question_object:
{
    question information
    instance of `Quiz_object`
}

Question_object:
{
    question information
    instance of `Quiz_object`
}

Question_object:
{
    question information
    instance of `Quiz_object`
}
     

}

所以我的Quiz对象在对象中多次重复。

我是否应该关注这个问题,还是PHP处理我传递的实例只是对象的“引用”?

2 个答案:

答案 0 :(得分:3)

不要担心,因为PHP的第5版传递对象是通过引用完成的。

答案 1 :(得分:3)

即使你将相同的测验实例分配给多个变量,这根本不是问题,但可以完全没问题。

因为这里有一个实例,并且每个变量都是访问那个实例的一种方式,所以在您的示例中,问题知道哪个测验是他们的一部分的。

在您的设计中,问题需要知道它们属于哪个测验,这是您所需要的,因此它通常适用。

这是标准的1:n关系:

   1:n

quiz:questions

请注意保持关系数量达到应用程序运行所需的最小值。