如何解决由命名实参生成的错误以及函数调用中的实参解压缩未在PHP-8中引发ErrorException
以下代码按预期工作:抛出ErrorException并为require
产生的致命错误调用shutdown函数
register_shutdown_function(function() {
echo "anyway,hello world\n";
});
set_error_handler(function($severity,$message,$file,$line) {
throw new ErrorException($message,$severity,$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)
解决方法
正如评论中指出的,确实是不同类型的致命错误的致命案例。
由于这属于“在执行脚本之前生成的”类别,因此很遗憾,永远不会调用关闭功能。太糟糕了,我没有发现任何致命错误属于此类别。
,是的,事实证明这不是错误!
类型为E_COMPILE_ERROR
致命的编译时错误。这就像一个E_ERROR,除了 由Zend脚本引擎生成
还有E_PARSE
编译时解析错误。解析错误仅应由 解析器
是这种行为的唯一原因(此外,如果该进程是用SIGTERM杀死的,或者在关闭功能之前调用了SIGKILL信号或exit
或die
)
以下是此类错误的列表
- https://3v4l.org/oO4L7 =>函数的重新声明
- https://3v4l.org/cNHbu =>
private
抽象方法 - https://3v4l.org/jPpIU =>访问级别的限制必须相同或更少
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。