Hello Daine,

  as far as i can tell that assumption is correct. Destructor calls are not
reliable in shutdown. That is they are at one point all called. For any
destructor that creates a new object the destructor of that new object might
not be called. Plus a bunch of other unexpected behavior.

regards
marcus

Wednesday, December 21, 2005, 1:20:36 AM, you wrote:

> I see where all this is going.
> As long as the destructor is not called as part of the cleanup code, it
> works fine.
> Is that assumption correct?


> On Wed, 21 Dec 2005 00:14:15 +0000, Daine Mamacos wrote
>> Marcus,
>> I'm not trying to argue with you, I'm just after some help.
>> You are confusing me somewhat.
>> The php manual clearly states:
>> "Note: Attempting to throw an exception from a destructor causes a 
>> fatal error." I'm somewhat convinced that you cannot throw an 
>> exception from a destructor, well you can, but it gets you nowhere.
>> 
>> What does forcing the call of a destructor have to do with this conversation?
>> 
>> If you can think of a way of working around this, that would be 
>> greatly appreciated.
>> 
>> Anyway,
>> Thanks
>> Daine Mamacos
>> 
>> On Tue, 20 Dec 2005 21:27:30 +0100, Marcus Boerger wrote
>> > Hello Daine,
>> > 
>> > a) i didn't contradict myself - you obviously didn't really follow
>> >    what i wrote
>> > 
>> > b) you can force calling the destructor by using unset() or = null;
>> >    but only if reference count is 1.
>> > c) exceptions are 'thrown' not called, maybe you didn't use throw new
>> >    exception here or you were just writing a bit weired?
>> > d) as said already several times (not only to you) exceptions *can*
>> >    be thrown in destructors
>> > 
>> > e) this doesn't belong in internals@
>> > 
>> > regards
>> > marcus
>> > 
>> > Tuesday, December 20, 2005, 6:22:31 PM, you wrote:
>> > 
>> > > I agree completely...
>> > > I think the GC should be better documented.
>> > > I also would like someone to tell me why exceptions cannot be called in 
>> > > the
>> > > destructor? Since they can't, this means the reliability of a destructor 
>> > > is
>> > > uncontrolled and nothing can be done to see if this completes 
>> > > successfully.
>> > 
>> > > This in some way or another, renders them completely useless if you 
>> > > require
>> > > them to complete an operation and at least have the peace of mind that 
>> > > you
>> > > will be able to deal with errors rather than the application throwing a 
>> > > fatal
>> > > error.
>> > 
>> > > On Tue, 20 Dec 2005 11:38:34 -0500, Alan Pinstein wrote
>> > >> > Your last post also indicates, that because the destructors are  
>> > >> > only called
>> > >> > after script termination, the scope of an object is global, always.
>> > >> > Is this true?
>> > >> 
>> > >> This isn't true, at least empirically. Destructors are called when  
>> > >> the GC frees the object.
>> > >> 
>> > >> For many objects, this is at script termination. But if you null out 
>> > >>  the ref to an object, it will occur immediately.
>> > >> 
>> > >> $a = new A();
>> > >> $a = null; // destructor called just after this line
>> > >> 
>> > >> I am not certain that this should be considered *predictable*  
>> > >> behavior, as the behavior of the GC is not well/publicly documented  
>> > >> to my knowledge, and thus this is a reasonable question for the  
>> > >> internals list.
>> > >> 
>> > >> Personally I would like to see more documentation of how GC works so 
>> > >>  that we as developers can depend on it a little better for OO 
>> > >> cleanup  activities. I have another thread going that still remains 
>> > >> unanswered  about how to prevent circular references to objects that 
>> > >> deadlock the  GC.
>> > >> 
>> > >> Alan
>> > >> 
>> > >> > Also, I've called fwrite in a destructor before, so clearly not all  
>> > >> > IO is
>> > >> > terminated before the destructor is called.
>> > >> > When you refer to output facility, what are you talking about?
>> > >> >
>> > >> > Many thanks
>> > >> > Daine Mamacos.
>> > >> >
>> > >> >
>> > >> > On Mon, 19 Dec 2005 20:16:07 +0100, Marcus Boerger wrote
>> > >> >> Hello Daine,
>> > >> >>
>> > >> >>   you still don't get it. Your problem is the way php works. You
>> > >> >> cannot put any output functionality in destructors because they are
>> > >> >> called *after* your scipt is being terminted (to be precise after
>> > >> >> the output facility has been shutdown on script termination).
>> > >> >>
>> > >> >> This is btw a question the general php list.
>> > >> >>
>> > >> >> marcus
>> > >> >>
>> > >> >> Monday, December 19, 2005, 11:07:53 AM, you wrote:
>> > >> >>
>> > >> >>> While you're example works, mine doesn't, it has to do with the  
>> > >> >>> class
>> > >> >>> assignment. If you actually bother to do anything with the class, it
>> > >> > doesn't work.
>> > >> >>
>> > >> >>> $ php -r 'class blah { function __destruct() { throw new Exception 
>> > >> >>> ("exception
>> > >> >>> thrown"); } } $blah = new blah();'
>> > >> >>
>> > >> >>> give that a try and see what happens
>> > >> >>> (;
>> > >> >>> also http://bugs.php.net/bug.php?id=33598 clearly states that  
>> > >> >>> they cannoy be
>> > >> >>> thrown in the destructor.
>> > >> >>> Errrr... *shrug*
>> > >> >>
>> > >> >>> On Fri, 16 Dec 2005 20:38:20 +0100, Marcus Boerger wrote
>> > >> >>>> Hello Daine,
>> > >> >>>>
>> > >> >>>> [EMAIL PROTECTED] /usr/src/PHP_5_1 $ php -r 'class A{function
>> > >> >>>> __destruct(){throw new Exception("A");}} new A;' make:
>> > >> >>>> `sapi/cli/php' is up to date.
>> > >> >>>>
>> > >> >>>> Fatal error: Uncaught exception 'Exception' with message 'A' in
>> > >> >>>> Command line code:1 Stack trace:
>> > >> >>>> #0 Command line code(1): A::__destruct()
>> > >> >>>> #1 {main}
>> > >> >>>>   thrown in Command line code on line 1
>> > >> >>>>
>> > >> >>>> As the code above clearly show, exceptions can be thrown.
>> > >> >>>>
>> > >> >>>> marcus
>> > >> >>>>
>> > >> >>>> Friday, December 16, 2005, 3:17:54 PM, you wrote:
>> > >> >>>>
>> > >> >>>>> Is there any reason why one is not allowed to throw an  
>> > >> >>>>> exception in the
>> > >> >>>>> destructor of a class?
>> > >> >>>>> I mean, it makes sense, considering this is not always the  
>> > >> >>>>> final step
>> > >> > of code,
>> > >> >>>>> and it is usually used for finalising things, and it would be a  
>> > >> >>>>> good
>> > >> > idea to
>> > >> >>>>> know if anything goes wrong at that stage.
>> > >> >>>>> Otherwise is there any compromise one can use to "emulate" this  
>> > >> >>>>> feature?

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to