Abu Warez wrote: > --- On Fri, 6/27/08, Thijs Lensselink <dev@xxxxxxxx> wrote: > >> From: Thijs Lensselink <dev@xxxxxxxx> >> Subject: Re: unset and circular references >> To: php-general@xxxxxxxxxxxxx >> Date: Friday, June 27, 2008, 5:21 PM >> Quoting Abu Warez <abuwarez@xxxxxxxxx>: >> >> > > >> I think this happens because there is still a reference to >> > the B object. > >> According to the manual : >> >> The destructor method will be called as soon as all >> references to a >> particular object are removed or when the object is >> explicitly >> destroyed or in any order in shutdown sequence. >> >> So as long as A has a reference to B the __destructor will >> not be called. >> > > I think you mean: "As long as B has a ref to A (which, indeed, creates B), > the destructor of A will not be called". > My bad. that's what i meant. > I agree with that, but in this case the garbage collector should detect > that the reference to object $a is from an object $m_b which is created (and maintained) again by the first object $a. In other words, if object $a is not needed then its member $m_b (which has a reference to $a) is not needed neither. So in this case, in my opinion, if one wants to destory object $a then the reference from $m_b to $a should not count. > That would still leave a reference from B to A. That's why it doesn't get unset. If you unset B before unsetting A the problem is resolved. > This issue is really frustrating because because in my code I have something like (where $a is of type class A): > > for ( $id ... ) > { > $a = daoMyClass->LoadById( $id ); > .... modify $a ... > /* persist modified $a */ > daoMyClass->Update( $a ); > unset( $a ); > } > > unset, as stated, does not destroy $a and all the loaded $a's remain in > memory until the script ends. Rising the memory limit is not a solution > because the count of $a objects grows between script calls. Any ideas? > > Thx, > Abu > > > > > > > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php