2016-09-17 136 views
0

給出的嵌套,如果下面的語句:PHP如何評估複合if語句?

if(file_exists($fullPathToSomeFile)) { 
    if(is_readable($fullPathToSomeFile)) { 
     include($fullPathToSomeFile); 
    } 
} 

,這如何不同於:

if(file_exists($fullPathToSomeFile) && is_readable($fullPathToSomeFile)) { 
    include($fullPathToSomeFile); 
} 

具體來說,我想知道PHP會如何對待is_readable()如果$ fullPathToSomeFile不存在(第一有條件失敗)。

在某些時候,我開始嵌套這些因爲使用單線版本在某些條件下拋出錯誤。在我看來,使用任何'和'都會要求PHP評估所有內容,而不管真假結果如何。

我真正想要的是當它達到第一個false時停止評估,從而防止條件失敗時的警告或致命錯誤。做它嵌套(第一個例子)保證這一點,但嵌套如果語句難以閱讀和維護。

目前處理此問題的最佳做法是什麼?

+0

就「include」語句而言,它們並沒有區別。兩個「if」陳述都必須是真實的。不同之處在於,如果你想讓邏輯依賴於現有的文件,但不一定是可讀的。如果'file_exists'失敗 - – Blake

+0

- 沒有必要檢查'is_readable',因爲在這種情況下結果將__NEVER__爲真。 –

+0

@u_mulder事實並非如此。該文件可能存在,但是可能會阻止其被讀取。 – Blake

回答

1

具體來說,我想知道如果$ fullPathToSomeFile不存在(第一個條件失敗),PHP將如何處理is_readable()。

PHP對於&&運營商使用short-circuit evaluation。也就是說,如果if (A && B)等表達式中的第一個條件失敗,則顯然整個條件將是錯誤的。因此,第二個條件B不需要評估以確定結果,並且根本不會被評估。

就拿下面的代碼:

<?php 
    function hey() 
    { 
    echo "Hey there!\n"; 
    return true; 
    } 

    if (false && hey()) 
    { 
    echo "Statement evaluated to true.\n"; 
    } 
    else 
    { 
    echo "Statement evaluated to false.\n"; 
    } 
?> 

這將呼應只有一條線(「聲明結果爲假。」),而不是「嘿!」,因爲如果條件的第二部分將不會被評估。

+0

這是我認爲的(基於PHP手冊中的第一個示例),但手冊中的示例相當不清楚。謝謝! – DrDamnit