|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-06-20 22:03 UTC] woody dot gilk at kohanaphp dot com
Description:
------------
When using a custom error handler, it is possible to make PHP trigger an
E_FATAL by concatenating an object with a __toString() method together
with a variable that is not set.
Tested in 5.2.9 and 5.2.10.
Reproduce code:
---------------
<?php
class test {
public static function error_handler($code, $error, $file = NULL, $line = NULL)
{
// This error is not suppressed by current error reporting settings
throw new ErrorException($error, $code, 0, $file, $line);
}
public static function run()
{
$object = new self;
echo $object.$foo;
}
public function __toString()
{
return __CLASS__;
}
}
error_reporting(E_ALL);
set_error_handler(array('test', 'error_handler'));
test::run();
Expected result:
----------------
PHP Fatal error: Uncaught exception 'ErrorException' with message
'Undefined variable: foo' in php_bug.php:15
Stack trace:
#0 php_bug.php(15): test::error_handler()
#1 php_bug.php(29): test::run()
#2 {main}
thrown in php_bug.php on line 15
Actual result:
--------------
PHP Fatal error: Method test::__toString() must not throw an exception
in
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 23:00:01 2025 UTC |
To add a little more information here, I should be able to do this: try { echo $object.$foo; } catch (ErrorException $e) { // Trap the E_NOTICE from $foo being undefined echo 'error occurred'; } However, because an E_FATAL is incorrectly triggered, it is impossible to do so.