以下代码按预期工作:抛出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");
输出:
致命错误:无法将命名参数和打开的参数组合起来
组合所有这些也没有按预期工作,并且来自require
的ErrorException
没有捕获
// ...
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信号杀死,或者在关闭函数之前调用了exit
或die
(
以下是的此类错误列表
- https://3v4l.org/oO4L7=>函数的重新声明
- https://3v4l.org/cNHbu=>
private
abtral方法 - https://3v4l.org/jPpIU=>Acess级别必须相同或限制较少