Bug #53086 [Com]: require fails in error handler when E_STRICT is emitted from namespace class

2010-10-19 Thread cmanley at xs4all dot nl
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 **

 '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 **

http://bugs.php.net/bug.php?id=53086&edit=1


Bug #53086 [Com]: require fails in error handler when E_STRICT is emitted from namespace class

2010-10-19 Thread uramihsayibok at gmail dot com
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 **

 '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 **

http://bugs.php.net/bug.php?id=53086&edit=1