簡體   English   中英

if($ val)vs if($ val!=“”)vs。if(!empty($ val)) - 哪一個?

[英]if($val) vs. if($val != “”) vs. if(!empty($val)) — which one?

我看到很多人使用各種不同的方法來檢查變量是否為空,確實似乎沒有達成共識。 我聽說if($foo)if(!empty($foo))if($foo != "")完全相同。 這是真的?

我意識到這是一個非常簡單的問題,但我真的很想知道。 有什么不同嗎? 我應該使用哪種方法?

裸測試與空字符串比較的區別

if($foo != "") if($foo) 大部分時間等於if($foo) ,但並非總是如此

要查看差異的位置,請考慮比較運算符行為以及第一種情況下的字符串規則 轉換以及第二種情況的轉換為布爾規則

我發現的是:

  • 如果$foo === array()if($foo != "")測試將成功(數組是“大於”字符串),但if($foo)測試將失敗(空數組轉換為布爾值false
  • 如果$foo === "0" (一個字符串), if($foo != "")測試將再次成功(顯然),但if($foo)測試將失敗(字符串"0"轉換為布爾值false
  • 如果$foo是一個從空標簽創建的SimpleXML對象, if($foo != "")測試將再次成功(對象是“大於”字符串),但if($foo)測試將失敗(這樣的對象)轉換為布爾值false

看看行動的差異

更好的測試方法

測試首選方法if(!empty($foo)) ,它與上面的完全相同:

  1. 它不會受到if($foo != "") (IMHO簡直太可怕)的不一致性的影響。
  2. 如果當前作用域中不存在$foo ,則不會生成E_NOTICE ,這是其優於if($foo)主要優勢。

這里有一個警告:如果$foo === '0' (一個長度為1的字符串),那么empty($foo)將返回true ,這通常是(但可能並不總是 )你想要的。 這也是if($foo)的情況。

有時您需要使用相同的運算符進行測試

最后,當您要測試特定類型的值時,必須對上述內容進行例外處理。 例如, strpos可能返回0並且也可能返回false 這兩個值都將失敗if(strpos(...))測試,但它們具有完全不同的含義。 在這些情況下,使用相同運算符的測試依次為: if(strpos() === false)

不,並非總是如此。 當你執行if($foo) PHP將變量轉換為Boolean。 空字符串,零整數或空數組將為false 有時這可能是一個問題。

你應該總是盡量使用最具體的比較,如果你期望一個字符串可以是空的使用if($foo==='') (注意三個等號)。 如果您期望(布爾值)false或資源(例如來自數據庫查詢),請使用if($foo===false){...} else {...}

您可以閱讀有關轉換為布爾值文檔以查找此問題的答案。 其中有一個列表,其值分別轉換為truefalse

請注意, empty也會檢查變量是否已設置,而常規比較則不會。 未設置的變量將在比較期間觸發類型E_NOTICE的錯誤,但在使用空時不會觸發。 您可以在比較之前使用isset調用解決此問題,如下所示:

if(isset($foo) && $foo != '')

if() “轉換”給bool的語句,所以看一下boolean文檔似乎就是你要找的東西。 一般來說:

  • 空字符串( "" ),空數組( array() ),零( 0 )和布爾值false( false )被視為false
  • 其他一切( "foo"1array('foo')true ,...)被視為true

編輯:
有關更多信息,您還可以檢查類型比較表

empty($ foo)應該在所有這些情況下返回true:0,“”,NULL。

有關更完整的列表,請查看此頁面: http//php.net/manual/en/function.empty.php

不,這不相等。 如果未定義變量,則不帶empty表達式將生成有關未定義變量的通知。

暫無
暫無

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

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