Re: unset( $anobject) does not invoce __destruct()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx> wrote in message
news:a5f019de0908240749l8fa749s825cfa0e475f7775@xxxxxxxxxxxxxxxxx
2009/8/24 Ralph Deffke <ralph_deffke@xxxxxxxx>:
> 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@xxxxxxxxxxxx> wrote in message
> news:41.F9.03363.011929A4@xxxxxxxxxxxxxxx
>> 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
>
>



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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux