这是我的代码:
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);
}
答案 0 :(得分:7)
因为operator precedence。布尔AND(&&
)的优先级高于赋值(=
),因此第一个语句是有效的:
$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE)
您需要添加括号才能获得所需的结果:
($jsonObj = json_decode($someJson)) && json_last_error() == JSON_ERROR_NONE
答案 1 :(得分:1)
此:
$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
你的第二个建议可以正常工作,尤其是如果 falsy 值(0,NULL
,false,空数组......)是 json_decode
的有效结果。
答案 2 :(得分:1)
这是因为=
对逻辑运算符的优先级较低:
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
表示)。然后,结果将分配给$jsonObj
,后者变为1
。最后,评估if
子句。
您的第一个版本实际上相当于:
$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE);
if ($jsonObj) {
//....
}
答案 3 :(得分:0)
更改
if(
$jsonObj = json_decode($someJson) &&
json_last_error() == JSON_ERROR_NONE
) {
到
$jsonObj = json_decode($someJson);
if ($jsonObj && json_last_error() == JSON_ERROR_NONE){
&&
正在=
之前解析,因此您指定了真正的