来自手册:
警告 目前"@"错误控制运算符前缀甚至 禁用将终止脚本的严重错误的错误报告 执行。除此之外,这意味着如果您使用"@"来 抑制来自某个函数的错误,要么它不可用 或者输入错误,脚本将在那里死去,没有 说明原因。
但是,此代码在运行时:
<?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更改了报告错误的方式:
PHP7 改变了 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 中被禁止显示。这可以在这里看到。