4

I have two classes, Quiz and 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;
            }
        }
    }
}

As you can see, I need to give my Question objects access to my Quiz objects values: $quiz_type and $personalities.

If I wish to load all questions and with their possible personality outcomes I will use the following code:

$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();
}

If I wish to show just one question (and all personality information), I can use the following code:

$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();

I am concerned that each of my Question objects needs information from the Quiz object in order to function.

When I load all of the Question objects in to my Quiz (using $quiz_object->LoadQuestions), my quiz object essentially contains the question information as well as an instance of itself multiple times for each question of the quiz.

So it looks a little bit like

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

}

So my Quiz object is duplicated multiple times within the object.

Should I be concerned about this, or does PHP handle the instance that I pass around as simply a "reference" to the object?

Luke
  • 22,826
  • 31
  • 110
  • 193

2 Answers2

3

Even you assign the same quiz instance to multiple variables, this must not be an issue at all but can perfectly okay.

Because you have a single instance here, and each variable is a way of accessing that one instance, here in your example the questions know of which quiz they are part of.

As in your design the questions need to know to which quiz they belong to, this is what you need so it's generally applicable.

It is a standard 1:n relationship:

   1:n

quiz:questions

Take care that you keep the number of relations to the needed minimum for your application to work.

hakre
  • 193,403
  • 52
  • 435
  • 836
  • I'm a little confused :(. There's a way to get the Quiz information from my Questions when they are within the Quiz object? – Luke Sep 28 '12 at 14:20
  • `new Question($question_id, $quiz_object);` <- at least you pass the quiz into each question, so I'd say yes. :) – hakre Sep 28 '12 at 14:23
  • So by the sounds of it, I could pass that object to as many questions as I want and it won't duplicate the values. It simply has a way of referring to the same object? – Luke Sep 28 '12 at 14:32
  • Exactly. This is why you call it object somehow as well. All questions refer to the *same* quiz object. The number of variables does not count. – hakre Sep 28 '12 at 14:39
2

Do not worry, since version 5 of PHP passing around objects is done by reference.

JvdBerg
  • 21,777
  • 8
  • 38
  • 55
  • **-1** : **wrong**. Since PHP5 objects are passed around by object handlers. Please watch http://www.youtube.com/watch?v=bxxIXPc9IR8 for additional details. – tereško Sep 28 '12 at 13:52
  • tereško is just being annoying, passing by object handles in the end means that the object is not duplicated, and a reference to the object is passed around. – JvdBerg Sep 28 '12 at 14:06
  • 1
    @JvdBerg how is pointing out, that references and object handlers are different things, "being annoying" ? Please read http://www.php.net/manual/en/language.oop5.references.php – tereško Sep 28 '12 at 14:21
  • 1
    @tereško being a prick that downvotes for people that try to contribute are not as “knowledgeable” like you is being annoying. Sadly, SO is full of people like you. You must learn to contribute in a constructive way, not with your pedantic attitude. – Cory Sep 28 '12 at 19:26