skip to Main Content

The following code works as expected: throws the ErrorException and calls the shutdown function for the fatal-error generated by require

register_shutdown_function(function() {
    echo "anyway, hello worldn";
});

set_error_handler(function($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});

set_exception_handler(function($exception) {
    echo $exception->getMessage().PHP_EOL;
});

require "unavailable_file";

Output:

require(unavailable_file): Failed to open stream: No such file or directory

anyway, hello world

But fatal error generated by named arguments fails to call the exception-handler and the shutdown function

// replacing require in the previous code with the following

function foo() {}

foo(...[], bar: "baz");

Output:

Fatal error: Cannot combine named arguments and argument unpacking

Combining all of them also is not working as expected and the ErrorException from require is not caught

// ... 

require "unavailable_file";

function foo() {}

foo(...[], bar: "baz");

Output:

Fatal error: Cannot combine named arguments and argument unpacking

So is this another bug or am I missing something here?

PS: The PHP version is 8.0.0RC2 (cli)

2

Answers


  1. As pointed out in the comments, it was indeed the case of different fatal type of fatal errors.

    Since this falls under the category "generated before script is executed", unfortunately the shutdown function will never be called. Too bad I did’t find anything showing which fatal errors fall under this category.

    Login or Signup to reply.
  2. Yes, it turns out this is not a bug!

    Errors of type E_COMPILE_ERROR

    Fatal compile-time errors. This is like an E_ERROR, except it is
    generated by the Zend Scripting Engine

    And also E_PARSE

    Compile-time parse errors. Parse errors should only be generated by
    the parser

    Are the only reason for such behavior (plus if the process is killed with a SIGTERM, or SIGKILL signal or exit or die were called before the shutdown function)

    Here is a list of such errors

    1. https://3v4l.org/oO4L7 => Redeclaration of a function
    2. https://3v4l.org/cNHbu => private abtract methods
    3. https://3v4l.org/jPpIU => Acess level must be the same or less restrictive
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search