Re: unset( $anobject) does not invoce __destruct()
| From: | Ralph Deffke | Date: | Mon, 24 Aug 2009 19:48:16 +0000 |
| Subject: | Re: unset( $anobject) does not invoce __destruct() | ||
| References: | 1 2 3 4 5 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-297142@lists.php.net to get a copy of this message | ||
Stuart, u are right, the refcount in php 5 doesn't matter, where something
left behind in my memory from earlier days, However i do have the effect
that unsetting an object does NOT call __dectruct() ! but when the script
ends it is called. this can be easily tested by putting a echo in destruct.
my objects affected are pretty much the sheme I send. however I'm doing some
reflection stuff in my classes. may be thats the reason. I will do some
further investigation about that.
"Stuart" <stuttle@gmail.com> wrote in message
news:a5f019de0908240749l8fa749s825cfa0e475f7775@mail.gmail.com...
2009/8/24 Ralph Deffke <ralph_deffke@yahoo.de>:
> this is also not the full truth try this and it works
> what are the circumstances that is causing this problem then, yes I do
have
> distributed references over my script and there are clearly references
still
> set, however after running the snipped script I can not see what I do
> special in my script causing the problem. I even tried with public and
> private static in other objects. it works. however the manual indicates
the
> refernce counter has to be 0.
Assuming you're using PHP 5...
> <?php
>
>
> abstract class a {
> public function __construct(){
> echo "constructing....<br>";
> }
> public function __destruct(){
> echo "destructing....<br>";
> }
> }
>
> class b extends a{
>
> }
>
> $c = new b();
refcount = 1
> $d = $c ; // works
refcount = 2
> $f[] = $c ; // works
refcount = 3
> class e {
> private $m;
>
> public function setM( $m ){
> $this->m = $m;
> }
> }
>
> $o = new e();
> $o->setM( $c ); // works
refcount = 4 (due to assignment in setM)
> unset( $c );
refcount = 3
In PHP 5 all objects are passed by reference unless explicitly cloned.
This means that assigning an object variable to another variable does
nothing more than assign a reference and increment the referece count.
What exactly in the manual leads you to believe that after the unset
the refcount should be 0?
-Stuart
--
http://stut.net/
> "Lupus Michaelis" <mickael+php@lupusmic.org> wrote in message
> news:41.F9.03363.011929A4@pb1.pair.com...
>> kranthi wrote:
>> > unset($obj) always calls the __destruct() function of the class.
>>
>> Never calls the dtor. The dtor will be called only when the reference
>> count reaches 0.
>>
>> class c { function __destruct() { echo 'dying !' ; } }
>> $v1 = new c ;
>> $v2 = $v1 ;
>>
>> unset($v1) ; // don't call the dtor
>> unset($v2) ; // call the dtor
>>
>> --
>> Mickaël Wolff aka Lupus Michaelis
>> http://lupusmic.org
>
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>