0

似乎 PHP 的错误抑制器@仍在触发我的自定义错误处理程序,尽管它没有在屏幕上显示错误。

例子:

@json_decode(array());

这不会在屏幕上输出错误消息,但仍会运行我的错误处理程序(例如,记录错误、向我发送电子邮件、终止脚本执行,就好像存在“真实”错误一样)。

有没有办法@完全保持沉默?

4

2 回答 2

4

如果您尝试检测有效的 json,则 atleat 确保您传递给的“参数”json_decode是字符串类型。

引用自 php.net:

以适当的 PHP 类型返回以 json 编码的值。值 true、false 和 null(不区分大小写)分别返回为 TRUE、FALSE 和 NULL。如果无法解码 json 或编码的数据深度超过递归限制,则返回 NULL。

因此NULL,我们正在寻找是否JSON无法解码。因此,无效的 JSON。但同样,只要确保传入的是字符串而不是其他类型,比如数组或布尔值或其他类型。因为那永远行不通。

我理解你的问题。@ 符号会抑制错误消息,但不会抑制实际的代码流。出错时仍会退出。但是你真的只需要放开@符号。

所以无论如何,你可能会有某种你调用的函数,它会做一些事情,包括json_decode. 这只是一个例子,但它应该让你明白我的意思。

<?php

// will fail, because it's not a string
$str1 = array ( "nooblol" ); 

// Will succeed. This is valid json
$str2 = '{"example":"value"}';

// Will fail, is of type string, but still an invalid json format
$str3 = 'invalid json string';

function saveData ( $json )
{
    // Check if the variable that we're about to pass
    // to json_decode() is an actual string. Otherwise we
    // have invalid json data anyway.
    if ( !is_string ( $json ) )
    {
        echo 'Invalid json (or invalid type)';
        return;
    }

    if ( !$obj = json_decode ( $json ) )
    {
        echo 'fail';
        return;
    }

    // Print json object
    print_r($obj);
}

saveData ( $str3 );

?>

现场示例:httpsaveData ://codepad.viper-7.com/KJL8st 将参数 更改为$str1$str2以查看不同的结果。

这是检查您是否有有效 json 的方法。不要仅仅依靠json_decode()函数来告诉你它是否是有效数据。它是一个函数,它只需要一个字符串。所以确保你传入一个字符串。只有这样它才能告诉你它是否是有效的 json。

于 2012-08-11T21:06:25.213 回答
2

我不相信你可以阻止错误处理程序看到被@.

但是,您可以隔离这些错误并忽略它们,风险自负。

将以下代码放入您的错误处理程序中:

// get the current error reporting level
$level = error_reporting();

// if error was supressed or $errno not set in current error level
if ($level == 0 || ($level & $errno) == 0) {
    return true;
}

请注意,这$errno是错误处理程序回调的第一个参数。

于 2012-08-11T19:27:33.730 回答