似乎 PHP 的错误抑制器@
仍在触发我的自定义错误处理程序,尽管它没有在屏幕上显示错误。
例子:
@json_decode(array());
这不会在屏幕上输出错误消息,但仍会运行我的错误处理程序(例如,记录错误、向我发送电子邮件、终止脚本执行,就好像存在“真实”错误一样)。
有没有办法@
完全保持沉默?
似乎 PHP 的错误抑制器@
仍在触发我的自定义错误处理程序,尽管它没有在屏幕上显示错误。
例子:
@json_decode(array());
这不会在屏幕上输出错误消息,但仍会运行我的错误处理程序(例如,记录错误、向我发送电子邮件、终止脚本执行,就好像存在“真实”错误一样)。
有没有办法@
完全保持沉默?
如果您尝试检测有效的 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。
我不相信你可以阻止错误处理程序看到被@
.
但是,您可以隔离这些错误并忽略它们,风险自负。
将以下代码放入您的错误处理程序中:
// 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
是错误处理程序回调的第一个参数。