这是我的代码:
if(
$jsonObj = json_decode($someJson) &&
json_last_error() == JSON_ERROR_NONE
) {
print_r($jsonObj);
}输出为1。另一种编写方式:
$jsonObj = json_decode($someJson);
if(
$jsonObj &&
json_last_error() == JSON_ERROR_NONE
) {
print_r($jsonObj);
}输出是一个stdClass (我想要的)。
为什么第一个代码块和第二个代码块的工作方式不一样?也许只要写成这样就可以了?:
$jsonObj = json_decode($someJson);
if(json_last_error() == JSON_ERROR_NONE) {
print_r($jsonObj);
}发布于 2013-05-16 04:24:01
这一点:
$jsonObj = json_decode($someJson) && json_last_error() == JSON_ERROR_NONE意思是:
$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE)这就是:
$jsonObj = ($somenonemptyvar && true)所以,$jsonObj就是true。
您可能想要使用:
($jsonObj = json_decode($someJson)) && json_last_error() == JSON_ERROR_NONE还有一些读物:operator precedence
不过,您的第二个建议可以很好地工作,特别是如果值不正确(0,NULL,false,empty array...)是您的json_decode的有效结果。
发布于 2013-05-16 04:23:26
因为operator precedence。布尔型AND (&&)比赋值(=)具有更高的优先级,因此第一个语句有效:
$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE)您需要添加括号以获得您想要的结果:
($jsonObj = json_decode($someJson)) && json_last_error() == JSON_ERROR_NONE发布于 2013-05-16 04:26:22
这是因为相对于逻辑运算符,=的优先级较低:
if (
$jsonObj = json_decode($someJson) &&
json_last_error() == JSON_ERROR_NONE
)是:
if ($jsonObj = json_decode($someJson) && json_last_error() == JSON_ERROR_NONE)其中分组为:
if ($jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE))所以这个逻辑条件:
json_decode($someJson) && json_last_error() == JSON_ERROR_NONE首先进行求值(结果TRUE,由1表示)。然后,将结果赋值给成为1的$jsonObj。最后,计算if子句。
你的第一个版本实际上相当于:
$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE);
if ($jsonObj) {
//....
}https://stackoverflow.com/questions/16574250
复制相似问题