4

我有两个班级,Quiz并且Question

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;
            }
        }
    }
}

如您所见,我需要让我的 Question 对象访问我的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();

我担心我的每个 Question 对象都需要来自 Quiz 对象的信息才能发挥作用

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

所以看起来有点像

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 是否将我传递的实例作为对对象的“引用”来处理?

4

2 回答 2

3

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

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

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

这是标准的 1:n 关系:

   1:n

quiz:questions

请注意将关系数量保持在应用程序正常工作所需的最低限度。

于 2012-09-28T14:06:04.740 回答
2

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

于 2012-09-28T12:30:06.857 回答