On Thu, 30 Oct 2003 22:54:49 +0100, you wrote:

>Hi there,
>
>I'm having trouble with passing objects as references.  What I want to 
>do is something like this:
[snip code]
>The above code give the output:
>
>instance:
>parent: test
>
>where I want it to give:
>
>instance: test
>parent: test

I don't pretend to fully understand PHP references, or the strange and
mysterious ways that they work in regards to PHP objects, but I can
tell you how to acheive the results you desire.  Someone else will
have to explain it. :)

First of all, you need to use the "=&" operator inside the constructor
for object_2.  Secondly, you need to use the same "=&" operator when
creating the new instance of object_1.  Full code follows:

class object_1
{
    var $my_child;

    var $my_array;

    function object_1()
    {
        $this->my_array = array('id' => 0, 'name'=>'');
        $this->my_child = new object_2($this);
    }
  
}

class object_2
{
    var $my_parent;
    function object_2(&$parent_object)
    {
        $this->my_parent =& $parent_object;
    }

    function set_parent()
    {
        $this->my_parent->my_array['id'] = 1;
        $this->my_parent->my_array['name'] = 'test';
    }
}

$instance =& new object_1();
$instance->my_child->set_parent();

echo "instance: ".$instance->my_array['name']."<br>";
echo "parent:
".$instance->my_child->my_parent->my_array['name']."<br>";

This outputs (on PHP 4.3.3):

instance: test
parent: test

Alternatively, you can forgo the "=&" operator when creating a new
instance of object_1 if you move the creation of the object_2 child
out of object_1's constructor and into another method.  Say we add
this method to object_1:

    function create_my_child() {
      $this->my_child = new object_2($this);
    }

Then you can do this:

$instance = new object_1();
$instance->create_my_child();
$instance->my_child->set_parent();

echo "instance: ".$instance->my_array['name']."<br>";
echo "parent:
".$instance->my_child->my_parent->my_array['name']."<br>";

This also outputs:

instance: test
parent: test

I really can't explain why either of these approaches work, but I
suspect that it has something to do with the phenomenon described
here:

http://www.php.net/manual/en/language.oop.newref.php

The headache I currently have prevents me from fully understanding
this, hopefully it will be clearer to you. :)

If someone sees that I'm leading Gareth astray here, feel free to jump
in and correct me...

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to