Edit report at http://bugs.php.net/bug.php?id=53086&edit=1
ID: 53086 Comment by: cmanley at xs4all dot nl Reported by: cmanley at xs4all dot nl Summary: require fails in error handler when E_STRICT is emitted from namespace class Status: Open Type: Bug Package: *General Issues PHP Version: 5.3.3 Block user comment: N New Comment: Well whatever it is, one doesn't have to be Nostradamus to predict that if this isn't changed/fixed that it's going to lead to a lot of namespace horror stories in the future. Previous Comments: ------------------------------------------------------------------------ [2010-10-19 13:06:17] uramihsayibok at gmail dot com Not sure if this should be a bug or whether it's just unexpected behavior. The file is included fine. bla() exists. But it exists in the MyNamespace namespace. So require_once('bla.php'); MyNamespace\bla(); return; works. The question is, then, whether the error handler should be in the global namespace, the namespace it was originally defined in, or the namespace of the code triggering the error. ------------------------------------------------------------------------ [2010-10-17 01:44:49] cmanley at xs4all dot nl Description: ------------ When an E_STRICT error is emitted from a class within a namespace and this is caught in a custom error handler, then require_once() fails. To demonstrate this bug, I created a minimal test below. It consists of 3 files. Place them in a directory and execute test.php from the command line. Test script: --------------- ************* file test.php ****************** <?php error_reporting(E_ALL | E_STRICT); // Custom error handler. function handle_error($code, $message, $file, $line, $context) { $code = $code & error_reporting(); if ($code == 0) { // skip @ suppressed errors. return; } $errors = array( E_ERROR => 'E_ERROR', E_WARNING => 'E_WARNING', E_PARSE => 'E_PARSE', E_NOTICE => 'E_NOTICE', E_CORE_ERROR => 'E_CORE_ERROR', E_CORE_WARNING => 'E_CORE_WARNING', E_COMPILE_ERROR => 'E_COMPILE_ERROR', E_COMPILE_WARNING => 'E_COMPILE_WARNING', E_USER_ERROR => 'E_USER_ERROR', E_USER_WARNING => 'E_USER_WARNING', E_USER_NOTICE => 'E_USER_NOTICE', E_STRICT => 'E_STRICT', E_DEPRECATED => 'E_DEPRECATED', ); if (array_key_exists($code, $errors)) { $errname = $errors[$code]; } else { $errname = $code; } $error = "Error handler caught $errname with message \"" . $message . '" at ' . $file . ' line ' . $line . ".\n"; error_log($error); require_once('bla.php'); bla($error); return; } set_error_handler('handle_error'); // This fails because bla.php can't be required in error handler: require_once('Abstract.php'); *************** Abstract.php ************** <?php namespace MyNamespace { abstract class AbstractFoo { abstract public static function foo(); // PHP 5.3 issues an E_STRICT here about abstract + static, even though it now supports static inheritance. } } *************** bla.php ****************** <?php function bla() { print "You should see this.\n"; } Expected result: ---------------- Error handler caught E_STRICT with message "Static function MyNamespace\AbstractFoo::foo() should not be abstract" at /home/cmanley/0/Abstract.php line 4. You should see this. Actual result: -------------- Error handler caught E_STRICT with message "Static function MyNamespace\AbstractFoo::foo() should not be abstract" at /home/cmanley/0/Abstract.php line 4. PHP Fatal error: Call to undefined function bla() in /home/cmanley/0/Abstract.php on line 4 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=53086&edit=1