由命名参数和函数调用中的参数拆包生成的错误未在PHP-8中引发ErrorException



以下代码按预期工作:抛出ErrorException并为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";

输出:

require(unavailable_file(:无法打开流:没有这样的文件或目录

不管怎样,你好世界

但是由命名参数生成的致命错误无法调用异常处理程序和关闭函数

// replacing require in the previous code with the following
function foo() {}
foo(...[], bar: "baz");

输出:

致命错误:无法将命名参数和打开的参数组合起来

组合所有这些也没有按预期工作,并且来自requireErrorException没有捕获

// ... 
require "unavailable_file";
function foo() {}
foo(...[], bar: "baz");

输出:

致命错误:无法将命名参数和打开的参数组合起来

那么这是另一个错误还是我在这里遗漏了什么?

PS:PHP版本为8.0.0RC2(cli(

正如评论中所指出的,这确实是不同致命类型的致命错误的情况。

由于这属于";"在执行脚本之前生成";,不幸的是,关闭函数永远不会被调用。遗憾的是,我没有发现任何显示哪些致命错误属于这一类的东西。

是的,事实证明这不是一个bug!

E_COMPILE_ERROR类型错误

致命的编译时错误。这就像一个E_ERROR,只是由Zend脚本引擎生成

还有E_PARSE

编译时解析错误。分析错误只能由解析器

是导致这种行为的唯一原因(加上如果进程被SIGTERM或SIGKILL信号杀死,或者在关闭函数之前调用了exitdie(

以下是的此类错误列表

  1. https://3v4l.org/oO4L7=>函数的重新声明
  2. https://3v4l.org/cNHbu=>privateabtral方法
  3. https://3v4l.org/jPpIU=>Acess级别必须相同或限制较少

相关内容

  • 没有找到相关文章

最新更新