似乎PHP的错误抑制器@
仍在触发我的自定义错误处理程序,尽管它不会在屏幕上显示错误。
示例:
@json_decode(array());
这不会在屏幕上输出错误消息,但它仍会运行我的错误处理程序(例如,记录错误,发送电子邮件,终止脚本执行,就像有“真正的”错误一样)。
@
是否有办法完全沉默?
答案 0 :(得分:3)
如果您正在尝试检测有效的json,那么请确保传递给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 );
?>
实例:http://codepad.viper-7.com/KJL8st
将saveData
参数更改为$str1
或$str2
以查看不同的结果。
这是检查你是否有有效json的方法。不要完全依赖json_decode()
函数来告诉你它是否是有效数据。它是一个函数,它只需要一个字符串。所以一定要传入一个字符串。只有这样它才能告诉你它是否是有效的json。
答案 1 :(得分: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
是错误处理程序回调的第一个参数。