You are here: Re: [PHP] destructor not called for static members? « PHP « IT news, forums, messages
Re: [PHP] destructor not called for static members?

Posted by Jochem Maas on 10/04/38 11:10

Richard Lynch wrote:
>><?php
>>class c1 {
>> public function __destruct() {
>> echo '__destruct';
>> }
>>}
>>
>>class c2 {
>> private static $_ref;
>>
>> public function __construct() {
>> self::$_ref = new c1();
>>
>> //$this->_ref = new c1();
>> }
>>}
>>
>>$obj = new c2();
>>unset($obj);
>>?>
>>
>>i thought this should display __destruct in both cases from
>>c2::__construct, but only the one with non static access seems to call
>>c1::destruct. and if i remove unsetting $obj from the end of code this
>>one also doesn`t work. is it expected behaviour? or maybe when
>>__destructor is called after script finishes execution than output is no
>>longer possible? i tried also send some information to file and this
>>also didn`t work. help please :)
>
>
> Another take on this:
>
> PHP can't destroy $_ref until the entire script, even with aute_append
> files, is completely done and gone, because you *MIGHT* make another c2()
> somewhere.

self::$_ref is completely independent of any instance of that class.
but the rest of what you say is correct AFAIK - basically by the time PHP
gets round to cleaning up the class from the 'program space' there is nothing
to 'talk' to regardless.

but anyway a quick demonstration which might prove helpful:

<?php

class c1 {
public function __destruct() {
echo "__destruct";
}
}

class c2 {
private static $_ref;
private static $_selfCnt = 0;

public function __construct() {
self::$_selfCnt++;
if (self::$_selfCnt == 1) {
self::$_ref = new c1();
}
$this->_ref = new c1();
}

public function __destruct() {
self::$_selfCnt++;
if (!self::$_selfCnt) {
// the last samurai has fallen
unset(self::$_ref);
}
}
}

$obj = new c2();
$obj2 = new c2();
unset($obj,$obj2);

?>

gives me triple "__destruct".

>
> It's quite likely that your c1 *IS* getting destroyed, but long after any
> output you can see, because STDOUT and STDERR are already shut down.
>
> Change your echo statements to do an error_log() and you just might see
> more things going on "behind the scenes" -- No promise though. PHP
> might not be calling the destructors at that point, as a general script
> cleanup might just be free()-ing big chunks of RAM instead of doing a full
> descructor call.
>

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация