Edit report at http://bugs.php.net/bug.php?id=53086&edit=1
ID: 53086 Comment by: uramihsayibok at gmail dot com 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: 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. Previous Comments: ------------------------------------------------------------------------ [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