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