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?

Daine Mamacos.

--
random signature

Best regards,
 Marcus

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

--
random signature

--
Best regards,
 Marcus                            mailto:[EMAIL PROTECTED]


--
random signature

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



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

Reply via email to