On Tue, Dec 06, 2005 at 10:46:36PM -0500, Alan Pinstein wrote:
> >the key thing to remember in php5 is that the old &$var
> >declaration has no real meaning in objects.  php5's objects exist
> >outside of the old oop reference. Consider:
> 
> Hmmm... I am not sure I believe this.
> 
> I understand how object refs work in PHP5. I understood how they  
> worked in PHP4. Sadly I had to learn the hard way... coming from a C/C 
> ++ background it was wierd, and not really useful, which is probably  
> why the updated it so nicely in PHP5.
> 
> If & was not intended to work on objects in PHP5, then it should fail  
> at runtime. I doesn't, and in fact has specific and different  
> behavior from assignment WITHOUT &.

My original statement was to show how the the php4 = &$o is
different.  To simply the problem you have:

<?php

        // sets object $o to instance of stcClass
        $o = new stdClass;

        // sets $c to point to the same instance as what $o is 
        // pointing to
        $c = $o;

        // we no longer need $o, but...
        $o = null;

        // the instance of stdClass no longer exists
        var_dump($o); /* null */
        var_dump($c); /* object(stdClass)#1 (0) { } */


        // sets object $o to point to instance stdClass
        $o = new stdClass;

        // $b and $o are now referencing the variable that happens to
  // reference an object
        $b = &$o;
        
        // object gets destroyed cause both $b and $o are the same vars
        $o = null; 
        var_dump($o); /* null */
        var_dump($b); /* null */

?>

In php5 variables are just containers that point to objects, so when you make
a variable a reference to another variable all you are doing is
saying these variables are the same thing.

php5's objects dont know any such thing as a reference, they just
know of instances of themselves. The variables ($o, $a, $b)
existance is just a container for the instance of the object. So in
the case when I do a:

  $b = &$o;

All that is happening is the container is identical, so when I say:

  $o = null;

Since $b is the same thing as $o , $b is set to null as well and
thus, there are now more variable (containers) that reference to
the instance of the  object, thus the object will get destroyed,
but.. if i say we have two containers:

  $o = new stcClass;
  $b = $o;

Now the instance of that 'new StdClass' is contained in two vars,
when I set $o to null, $b still exists since it doesn't know about
$o whats so ever, and the instance of the stdClass still exists.

I guess it comes down to objects are treated the same way as you
would expect these results:

<?php

  $i = 1;  /* aka new object */
  $k = $i;

  $i =  null;
  var_dump($i); /* null */
  var_dump($k); /* int(1) */

  $i = 1;  /* aka new object */
  $j = &$i;

  $i = null;
  var_dump($i); /* null */
  var_dump($j); /* null */

?>


 
> The sample code below shows that indeed, in practice, on 5.0.4, that  
> & will create another reference (ie a weak reference) to an object  
> WITHOUT incrementing the refcount....

I'm not sure how you mean a weak reference, and well a refcount is
rather meaning less in php userland.


Curt
-- 
cat .signature: No such file or directory

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

Reply via email to