2013-05-15 27 views
0

這是我的代碼:json_decode返回1裏面的時候,如果條件

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

回答

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,假,空array ...)是有效的結果爲您的json_decode

7

因爲operator precedence。布爾與(&&)具有比分配(=),因此第一條語句更高的優先級是有效的:

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

你需要添加括號,得到你想要的結果:

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

變化

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

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

=所以你要分配真實的&&是解決

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 

首先evalued(導致TRUE,通過1表示)。然後,結果被分配到$jsonObj,它變成1。最後,對if子句進行評估。

你的第一個版本實際上等同於:

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