簡體   English   中英

php if語句的評估順序

[英]php evaluation sequence of if-statements

我在清理用戶輸入(我不知道是否已發送POST-Data)時遇到麻煩。 當我只是這樣做來檢查:

if ($_POST["somedata"] == 2)
  DoSomething();

我將收到error_reporint = E_ALL的錯誤通知,可能未定義$_POST["somedata"] (例如,在沒有表單的情況下加載頁面)。

所以我現在檢查一下:

if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
  DoSomething();

這不會輸出錯誤,但是對我來說看起來非常不穩定。 我不確定我是否對我的PHP版本或語句的簡單性感到滿意。 當if語句更復雜時,只要這兩項的順序相同,是否還可以安全使用? 與所有PHP版本一起使用是否安全?

issetisset和( && )結合使用是相對正確的(它可以防止出現嚴格警告)。 一種更高級的方法是針對模式或模型進行自動輸入檢查。

你可以有:

$schema = array(
    "somedata" => "number"
);

使用模式方法需要一些架構,但是它消除了您可能擔心的不穩定問題。


值得一提的是,在語法級別上驗證輸入(我是否獲得了所有必需的輸入)與語義級別上的輸入驗證之間存在差異。 假設您有一個名為GetItem的服務,並且傳遞了id = 3 ,語法檢查器將檢查id屬性的存在,並且它是一個數字。 然后,您需要檢查3是否確實存在。

因此,與其返回invalid request (bad input)您可能不希望返回no such item

您的方法在功能上是正確的,因為如果第一項計算為false,則&&會短路。 正如您所懷疑的那樣,關於穩定性,有一個小問題,特別是與代碼復制有關,主要是您需要始終注意兩個密鑰都匹配相同的字符串(應該說這是代碼復制的問題)。

一種解決方法是定義一個函數,該函數執行檢查並在所需鍵存在的情況下返回內容,例如:

function arr(array $array, $key, $defaultValue=false) {
    return isset($arrray[$key]) ? $array[$key] : $defaultValue            
}

您因調用函數而付出的性能損失很小(您可以通過刪除$ array參數的類型提示來降低性能),但是您的代碼更穩定。

您的情況下的用法示例:

if(arr($_POST, 'somedata') === 2)) {
    // do your stuff
}

我們已經在工作中使用了一段時間,可以追溯到幾年前的代碼中。 使用起來很好,因為它首先檢查變量是否確實存在,然后才檢查它是否具有值。

您的代碼段是正確的。

    if (isset($_POST["somedata"]) && $_POST["somedata"] == 2)
            DoSomething();

我強烈建議您使用三重等於進行質量檢查。 檢出PHP相等(==雙重等於)和標識(===三次等於)比較運算符有何不同? 有關平等檢查的更多信息。

三重相等意味着它需要是一個整數,而不僅僅是一個字符串,這是一個很好的實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM