PHP的错误信息处理和错误报告

2024-07-23 23:37:00
丁国栋
原创 158
摘要:error_get_last 函数返回的是最后一个错误的信息,不论该错误是否在当前的错误报告级别内,它都会打印。

问:在PHP中error_get_last函数为什么不受error_reporting函数或者ini配置的设置?

答:在PHP中,error_get_last 函数的行为与 error_reporting 函数的设置无关,原因如下:
错误处理机制:error_reporting 函数用于设置脚本运行时的错误报告级别,它控制哪些错误会被报告和显示。然而,error_get_last 返回的是最后一个错误的信息,不论该错误是否在当前的错误报告级别内,总会返回错误信息
最后错误的存储:PHP 在内部会记录最后发生的错误信息,无论该错误是否被 error_reporting 过滤掉。因此,即使一个错误被设置为不报告,error_get_last 依然可以获取到这个错误的信息。
调试和日志记录:这种设计允许开发者在调试和记录日志时能够捕获到所有类型的错误,而不仅仅是那些被报告的错误。
error_get_last 目的是提供一个全面的错误信息接口,而 error_reporting 则是用于控制错误的报告和显示。两者的目的和功能不同,因此互不影响。


以下是一个测试用例。

<?php
error_reporting(E_ALL & ~ E_DEPRECATED);
// error_reporting(E_ALL ^ E_DEPRECATED); // 改写法同上。
class test{
    public function __construct()
    {
        $this->set();
    }
    public function set()
    {
        $this->k = 1; // 故意不定义 $this->k,而是直接赋值
    }
    public function get()
    {
        var_dump($this->k);
    }
}
$obj = new test();
$obj->get();
var_dump(error_get_last());

以上脚本在Apache2中打开会在浏览器中得到输出  int(1) array(4) { ["type"]=> int(8192) ["message"]=> string(51) "Creation of dynamic property test::$k is deprecated" ["file"]=> string(29) "/var/www/html/zsite/www/a.php" ["line"]=> int(15) }

由此可见,即使通过error_reporting函数设置了不显示 E_DEPRECATED 类型错误,但error_get_last函数还是得到了 deprecated 的提示。

--

发表评论
博客分类