ID: 37829
Updated by: [EMAIL PROTECTED]
Reported By: e at osterman dot com
-Status: Closed
+Status: Bogus
Bug Type: Class/Object related
Operating System: Debian
PHP Version: 5.1.4
Previous Comments:
------------------------------------------------------------------------
[2006-06-16 22:38:22] e at osterman dot com
Please ignore this bug report. My code example is not correct as
re-assigning a variable does not in any way change the scope. I'll
resubmit a better example.
------------------------------------------------------------------------
[2006-06-16 21:00:10] e at osterman dot com
Description:
------------
This is either a bug in PHP, or an undocumented consequence of the
language's design -- either of which should be addressed.
If you want to have an object set an error handler to a method in
itself, such that when the object passes out of scope or gets
destroyed, the __destruct method is called (and previous error handler
restored), you cannot do it. The __destruct method is not called until
program termination.
It appears that by setting the error handler to $this->method, causes
$this to become copied rather than referenced. Using Array( &$this,
'method' ) versus Array( $this, 'method' ) has no effect on the outcome
-- the problem is "problem" is the same.
It's kind'a like creating a scope wormhole, I know, but the
documentation doesn't say it's not allowed! :)
Reproduce code:
---------------
class TestErrorHandler
{
public function __construct()
{
print "construct\n";
set_error_handler( Array( $this, 'handler') );
}
public function __destruct()
{
print "destruct\n";
restore_error_handler();
}
public function handler()
{
print "handled\n";
}
}
$foo = new TestErrorHandler();
$foo = new TestErrorHandler();
print "done.\n";
Expected result:
----------------
construct
destruct
construct
done.
destruct
Actual result:
--------------
construct
construct
done.
destruct
destruct
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=37829&edit=1