On Wed, Dec 07, 2005 at 09:30:36PM -0500, Alan Pinstein wrote: > > On Dec 7, 2005, at 12:36 AM, Curt Zirzow wrote: > > > >I'm not sure how you mean a weak reference, and well a refcount is > >rather meaning less in php userland. > > So, this gets interesting. I don't know if you're familiar with the > circular-reference problem. But if you have two instances that have > references to each other, even once you remove all references to the > objects, they will not be GC'd since they have a mutual deadlock on > each other: > > $a = new MyObj; > $b = new MyObj; > $a->setB($b); // does $this->b = $b; > $b->setA($a); // does $this->a = $a; > > $a = NULL; > $b = NULL; > > The actual instances pointed to by $a and $b WILL NOT GET FREED HERE > as you would *wish*. However this is expected behavior. I would have to disagree with the 'as you would *wish*' part. if I pass something to a function/method via copy (vs reference) i would hardly expect code outside the function/method to affect their existance. > > Only by changing MyObj to store "weak references", that is references > to the objects that are NOT reference-counted, can you get the GC to > free the instances. > > function setB(&$B) { $this->b = &$a; } > function setA(&$B) { $this->a = &$b; } > > Now, the instances will be freed when the $a and $b are null'd out. I think you meant to type: function setB(&$a) { $this->b = &$a; } function setA(&$b) { $this->a = &$b; } And consider the definition written as: function setB(&$a) { $this->b = $a; } function setA(&$b) { $this->a = $b; } does the $a = null; and $b = null; outside the class cause the objects to get null'd inside the class as well? > So, while I now feel more confident of how references act with > respect to objects (which is, they act the same as they do for any > variable), I still am not sure what "$this->this" is and why it > worked so magically. You lost me on your $this->this statement. 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