[英]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版本一起使用是否安全?
將isset
與isset
和( &&
)結合使用是相對正確的(它可以防止出現嚴格警告)。 一種更高級的方法是針對模式或模型進行自動輸入檢查。
你可以有:
$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.