"Ernest E Vogelsinger" <[EMAIL PROTECTED]> wrote in message
news:5.1.1.6.2.20021108092657.02befe20@;mail.vogelsinger.at...
> At 03:36 08.11.2002, Tim Molendijk said:
> --------------------[snip]--------------------
>
> Ahh - culprit 1:
>
> You said the container is creating a child instance - I assume it's done
in
> the constructor...
>
> What you're doing here is to create a clone when assigning new()'s result
> to $testContainer1. You should rather
>         $testContainer1 =& new Container(TRUE);
>
> Note the ampersand here - if you don't you'll get a clone.
>
> Rule for references:
> If your object does something in its constructor, use a reference
> assignment for
>         new class()
>

Ernest,

Before your post I accidently found out a solution:
$testContainer1 = &new Container(TRUE) instead of $testContainer1 = new
Container(TRUE);

When I found this out I didn't understand WHY this was the solution...

Thanks to your comments I DO understand why... I suddenly see every jigsaw
piece fall in place :D

The difference between the first code snippet (that with $testContainer1)
and the second code snippet (that with $testContainer2) is that in code
snippet 2 the Container object is already constructed and assigned to
$testContainer2 when loading it. Then when it is loaded $this (in add())
refers to the object in $testContainer2 so no problem occurs.
But in code snippet 1 the Container object loads itself before it is
assigned to $testContainer1. During this process $this (in add()) refers to
the object that is being created. And now the core is: the object that is
being created is *not* the same object as the one that is assigned to
$testContainer1!! So the references to the created object will not refer to
$testContainer1!! That's it!!! I completely understand... Thanks a lot
Ernest!

>
> Again - make this
>         $newChild =& new Child(1);
>
>
> But you don't pass "$child" by reference! Make this
>         function (&$child)
>
> If you don't pass $child as a reference, the line
>         $child->parent = $this;
> will set the parent value of the clone that's passed as an argument, and
> leave the "original" $child unmodified!
>

This is not true in my case, because instead of doing:
function add(&$child) { ... }
I do:
function add($child) { ... }
and then call it with:
$this->add(&$child);

This has the same result... As far as I know I doesn't matter whether you
put an ampersand before the variable in your function definition or your in
your function call.

> Crosscheck all of your class code (and the code utilizing it) it you're
> always passing references. Ref's work like a charm until you mess up at a
> single location. Well, having made my way from C/C++ to PHP I'd rather
deal
> with pointers, but unfortunately PHP doesn't have them. So keep an eye
open .-)
>

The problem is solved and I completely understand why now. This last thing
is thanks to you Ernest.

Regards,
Tim

>
> --
>    >O     Ernest E. Vogelsinger
>    (\)    ICQ #13394035
>     ^     http://www.vogelsinger.at/
>
>



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

Reply via email to