gpt4 book ai didi

php - 确定error_reporting(0)和PHP前面的@之间的区别

转载 作者:行者123 更新时间:2023-12-03 07:49:25 25 4
gpt4 key购买 nike

为PHP系统编写了自定义错误处理程序后,我试图弄清楚如何确定错误报告级别(可以通过error_reporting()获得)是否已全局设置为Off(0)或仅针对该行禁用了使用@ prefix

当前的问题是在两种情况下error_reporting()函数都返回0

更新#1

不幸的是,此示例不适用于CentOS 6.8上的PHP 5.3.3,因为ini_get()函数返回的值与error_reporting()相同。

function errhandle($errno, $errstr, $errfile, $errline) {
if (error_reporting() === 0 && error_reporting() === (int)ini_get('error_reporting')) {
echo 'error_reporting(0) was used';
} else if (error_reporting() === 0 && error_reporting() !== (int)ini_get('error_reporting')) {
echo '@ was used';
}
}

set_error_handler('errhandle');

echo error_reporting()."\n";
echo @$arr['name'];

// Prints
22527
error_reporting(0) was used

最佳答案

除了error_reporting()之外,您还可以使用ini_get('error_reporting')检查错误报告级别。从理论上讲,这是相似的,但它之间的细微差别使它对于您尝试做的事情很有值(value)。

如果错误报告已使用error_reporting(0)在全局范围内禁用,则ini_get('error_reporting')将返回字符串0。但是,如果错误报告被忽略并且该行以@开头,它将返回一个非零值(现有INI指令的值)。

因此,您可以比较这两个值并确定发生了什么:

if (error_reporting() === 0 && error_reporting() === (int)ini_get('error_reporting')) {
echo 'error_reporting(0) was used';
} else if (error_reporting() === 0 && error_reporting() !== (int)ini_get('error_reporting')) {
echo '@ was used';
}

这只是您可以在自定义错误处理程序中执行的那种条件的示例。如果不是您想要的,请告诉我,我将尝试进行调整。

在我的PHP 7.1.2(在Windows上为CLI)上进行了本地测试。

更新#1

经过一番思考,我想到了这个主意。只是警告,这似乎很棘手且效率低下,但是我开始认为这可能是唯一的方法。

如果您遵循PHP文档中的 set_error_handler示例,则自定义错误处理程序的函数签名可能如下所示:
function myErrorHandler($errno, $errstr, $errfile, $errline)
换句话说,您具有发生错误的文件和行号。您可以使用此信息打开文件本身,查看该行号,解析标记并查找 @字符。代码如下所示:
function myErrorHandler($errno, $errstr, $errfile, $errline) {
$errfileContents = file($errfile);
$errlineContents = $errfileContents[$errline - 1];
$tokens = token_get_all('<?php ' . $errlineContents . ' ?>');
if (error_reporting() === 0) {
if (in_array('@', $tokens)){
echo '@ was used';
} else {
echo 'error_reporting(0) was used';
}
}
}

显然,您可以通过检查是否同时使用这两种技术来扩展该条件。

无论如何,它很丑陋,但是在我的PHP 5.6.6(Windows上的CLI)上为我工作。

关于php - 确定error_reporting(0)和PHP前面的@之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47040661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com