首页 > 解决方案 > 错误抑制器未按手册中的指示抑制未定义函数

问题描述

手册

警告 目前,“@”错误控制运算符前缀甚至会禁用将终止脚本执行的严重错误的错误报告。除其他外,这意味着如果您使用“@”来抑制某个函数的错误,并且它不可用或输入错误,则脚本将在那里死掉,而没有说明原因。

但是,此代码在运行时:

<?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

解决方案


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

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

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

...

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

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

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

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


推荐阅读