json_decode在内部如果条件返回1

时间:2013-05-15 20:20:27

标签: php json

这是我的代码:

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);
}

4 个答案:

答案 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)

因此,$jsonObjtrue

您可能想要使用:

($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){

&&正在=之前解析,因此您指定了真正的