错误抑制器未按照手册中对未定义功能的指示进行抑制



来自手册:

警告 目前"@"错误控制运算符前缀甚至 禁用将终止脚本的严重错误的错误报告 执行。除此之外,这意味着如果您使用"@"来 抑制来自某个函数的错误,要么它不可用 或者输入错误,脚本将在那里死去,没有 说明原因。

但是,此代码在运行时:

<?php
echo 'hello';
@foo();
echo 'earth';

显示和日志(对我来说(:

PHP Fatal error:  Uncaught Error: Call to undefined function foo() in /var/www/stackoverflow/error-suppressor.php:3
Stack trace:
#0 {main}
thrown in /var/www/stackoverflow/error-suppressor.php on line 3

这似乎与手册背道而驰。 我在这里错过了什么?

这里使用的 php 版本:7.1.12。

我假设这本手册根本没有针对 PHP 7 进行更新。

PHP 7更改了报告错误的方式

PHP

7 改变了 PHP 报告大多数错误的方式。现在,大多数错误都通过抛出错误异常来报告错误,而不是通过 PHP 5 使用的传统错误报告机制来报告错误。

由于错误层次结构不继承自异常,因此在 PHP 5 中使用catch (Exception $e) { ... }块来处理未捕获的异常的代码将发现这些块未捕获这些错误。需要catch (Error $e) { ... }块或 set_exception_handler(( 处理程序。

在 PHP 5.6.38 中,上述错误将被禁止显示,只记录hello。这可以在这里看到。即使您使用error_reporting(-1)打开所有错误报告,也是如此,如此处所示。同样,这与PHP手册相反:

传入值-1将显示所有可能的错误,即使在未来的 PHP 版本中添加新的级别和常量也是如此

具有讽刺意味的是,如果您使用error_reporting(0)关闭错误报告,那么错误消息也将在 PHP 7 中被禁止显示。这可以在这里看到。

最新更新