Ошибка, вызванная именованными аргументами и распаковкой аргументов при вызове функции, не вызывающей ErrorException в PHP-8

Следующий код работает должным образом: выдает исключение ErrorException и вызывает функцию выключения для фатальной ошибки, сгенерированной require

register_shutdown_function(function() {
    echo "anyway, hello world\n";
});

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";

Вывод:

require (unavailable_file): не удалось открыть поток: нет такого файла или каталога

в любом случае, привет мир

Но фатальная ошибка, сгенерированная именованными аргументами, не может вызвать обработчик исключений и функцию выключения.

// replacing require in the previous code with the following

function foo() {}

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

Вывод:

Неустранимая ошибка: невозможно объединить именованные аргументы и распаковку аргументов

Их объединение также не работает должным образом, и ErrorException из require не пойман

// ... 

require "unavailable_file";

function foo() {}

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

Вывод:

Неустранимая ошибка: невозможно объединить именованные аргументы и распаковку аргументов

Так это еще одна ошибка или я что-то здесь упускаю?

PS: версия PHP - 8.0.0RC2 (cli)

2 ответа

Решение

Как указано в комментариях, это действительно был случай фатальных ошибок другого типа.

Поскольку это подпадает под категорию "сгенерировано до выполнения сценария", к сожалению, функция выключения никогда не будет вызвана. Жаль, что я не нашел ничего, показывающего, какие фатальные ошибки подпадают под эту категорию.

Да, оказывается, это не баг!

Ошибки типа E_COMPILE_ERROR

Неустранимые ошибки времени компиляции. Это похоже на E_ERROR, за исключением того, что он генерируется Zend Scripting Engine.

А также E_PARSE

Ошибки синтаксического анализа во время компиляции. Ошибки парсинга должны генерироваться только парсером

Являются единственной причиной такого поведения (плюс, если процесс завершается сигналом SIGTERM, или SIGKILL, или exit или же die были вызваны перед функцией выключения)

Вот список таких ошибок

  1. https://3v4l.org/oO4L7 => Повторное объявление функции
  2. https://3v4l.org/cNHbu => private методы абстрагирования
  3. https://3v4l.org/jPpIU => Уровень доступа должен быть таким же или менее ограничительным
Другие вопросы по тегам