0

这是我的代码:

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

4 回答 4

7

因为运算符优先级。布尔 AND ( &&) 比赋值 ( ) 具有更高的优先级,=因此第一个语句实际上是:

$jsonObj = (json_decode($someJson) && json_last_error() == JSON_ERROR_NONE)

您需要添加括号以获得所需的结果:

($jsonObj = json_decode($someJson)) && json_last_error() == JSON_ERROR_NONE
于 2013-05-15T20:23:26.230 回答
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

还有一些阅读:运算符优先级

不过,您的第二个建议可以正常工作,尤其是如果虚假值(0、NULL、false、空数组...)对于您的json_decode.

于 2013-05-15T20:24:01.200 回答
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) {
    //....
}
于 2013-05-15T20:26:22.380 回答
0

改变

if(
    $jsonObj = json_decode($someJson) &&
    json_last_error() == JSON_ERROR_NONE
) {

$jsonObj = json_decode($someJson);
if ($jsonObj && json_last_error() == JSON_ERROR_NONE){

&&正在解决,=所以您分配的是 true

于 2013-05-15T20:24:05.360 回答