| 
	
 | 
 Posted by Ray Hauge on 12/07/05 02:10 
I am uncertain on this, but I believe that the $this variable is already  
just a reference to the class you are calling it from.  Then passing the  
reference by-reference to the addParent() method of the Child class  
could be what is causing your issue.  I'd be curious to see what would  
happen if you took out the pass-by-reference and instead pass-by-value  
for the addParent() method.  Then again, that doesn't particularly sound  
correct either. 
 
This link might help.  They cover a lot of advanced reference usage for PHP. 
 
http://www.onlamp.com/pub/a/php/2002/09/12/php_foundations.html 
 
Alan Pinstein wrote: 
 
> So.. I am having PHP5 memory management problems. 
> 
> They are similar to those described in this thread: 
> 
> http://aspn.activestate.com/ASPN/Mail/Message/php-Dev/1555640 
> 
> (so maybe this question belongs on php-dev but I figured I'd try here   
> first... seems like a userland question) 
> 
> Basically I have an object model to represent db objects, and I am   
> bulk-loading the objects via some PHP scripts. Sadly the scripts   
> consume unbounded memory because of this problem. 
> 
> I have done a lot of programming in C++ and Obj-C and the normal way   
> to handle circular references is to have parents "retain" (keep ref-  
> counted links) to their kids, and have the kids have "weak   
> references" (non-ref-counted) links to their parents. This way, when   
> the parent is no longer used, it will automatically 0-out the ref   
> counts to all children it links too and things GC correctly. 
> 
> Now, how to do this in PHP? 
> 
> Well, there are no "documented" weak references. However, I figured   
> out by trial that if you obtain a php-reference to an object, it   
> doesn't bump the refcount. 
> 
> Question #1: Is the fact that references to objects in the form   
> $objRef = &$obj don't bump the refcount of $obj an intended behavior   
> that can be counted on? If so, cool! 
> 
> So, now that we have a way to do weak references, we should be able   
> to implement a reasonable memory management scheme for parent-child   
> objects. 
> 
> Normally from the client side the interface should look something like: 
> 
> $parent = new Parent(); 
> $child = new Child(); 
> $parent->addChild($child); 
> 
> Where parent can have 0,n children and child can have 0,1 parent. 
> 
> And all of parent's internal links to child should be refcounted, and   
> the internal links from child to parent are weak (not ref-counted). 
> 
> So based on the above discovery about references, I tried to   
> implement this as such: 
> 
> class Parent 
> { 
>     public $children = array(); 
> 
>     // add a child to our list. We want a ref-counted link here. 
>     function addChild($child) 
>     { 
>         $this->children[] = $child;    // refCounted desired in   
> parent->child link 
>         $child->setParent($this); 
>     } 
> } 
> 
> class Child 
> { 
>     public $parent; 
> 
>     // set the parent object. We want a non-ref-counted link here. 
>     function setParent(&$parent) 
>     { 
>         // refCount NOT desired in child->parent link 
>         $this->parent = &$parent; 
>     } 
> } 
> 
> Now, you'd expect this would work, but it doesn't. On a hunch, I   
> changed the client code to: 
> 
> $parent = new Parent(); 
> $child = new Child(); 
> $parent->addChild($child); 
> $child->setParent($child);        // new line here - you can  
> successfully  create a reference to the object when not passed in as  
> $this 
> 
> Now, this works! However, it's not practical. The setParent call   
> should work from within the parent object.... 
> 
> So what I figured out is that $this is a "pseudo variable" according   
> to the docs, but I don't know what that means. Empirically I have   
> figured out that it means you cannot create a reference to it. 
> 
> Is this a feature or a bug? What's the workaround? 
> 
> This is a serious problem for PHP scripts that need to do things that   
> require large amounts of memory. 
> 
> Please advise. 
> 
> Thanks, 
> Alan 
>
 
  
Navigation:
[Reply to this message] 
 |