2009-08-15 33 views
0

我知道,例如,使用:應該在字符串中使用嚴格的比較嗎?

if (in_array('...'), array('.', '..', '...') === true) 

在:

if (in_array('...'), array('.', '..', '...') == true) 

可以提高性能,並避免一些常見的錯誤(如1 ==真),但我想知道是否有一個原因是使用的字符串比較嚴格,如:

if ('...' === '...') 

似乎做完全相同的事情:

if ('...' == '...') 

如果有人能夠給這個問題帶來一些光,我很感激。

回答

6

如果您知道這兩個值都保證爲字符串,那麼=====是相同的,因爲兩者之間的唯一區別是===將檢查類型是否相同,而不僅僅是有效值。

但是,在某些情況下,您並不確定值是否會是一個字符串 - 例如,像$ _GET和$ _POST變量。考慮以下幾點:如果foo傳遞作爲一個空字符串

$_GET['foo'] == "" 

上述表達式的值爲true,但如果沒有值在所有通過在foo它也將評估爲true。相比之下,

$_GET['foo'] === "" 

只評估爲true,如果一個空字符串在明確傳遞 - 否則的$_GET['foo']的價值可能相當於一個空字符串,但類型不會是因爲它實際上是一個空該索引的值,而不是一個字符串。

+1

在你的例子中,如果沒有任何值被傳遞給'foo',你會得到一個PHP E_NOTICE級別的錯誤。 – 2009-08-15 11:22:09

+0

明白了,謝謝。 – 2009-08-15 11:22:31

3

當你可以使用一個或另一個選擇嚴格的比較,因爲:

  1. 它具有更好的性能
  2. 它可以防止意外的結果

比較字符串時,你仍然可以有意想不到的效果因爲一個字符串可能是空的,或者你認爲一個字符串實際上不是。

您永遠不會使用兩個字符串文字的比較,因爲它總是可以減少爲TRUE或FALSE。例如:

if ('...' === '...') 

相同

if (TRUE) 

如此以來,你總是會被比較的至少一個變量,你必須假設你有意想不到的效果。

您可以在http://net-beta.net/ubench/處看到各種嚴格與寬鬆比較的基準測試結果。我也跑了我自己的測試,發現了相同的結果。

這是一個微型優化,這意味着你不應該改變現有的代碼,因爲它不會產生明顯的差異,但是如果你正在編寫新的代碼,你可能會習慣使用最有效的技術。

+0

謝謝。順便說一句,這些測試http://net-beta.net/ubench/index.php?t=array10似乎並不相同。你運行該網站? – 2012-12-05 01:10:15

+0

該網站是一個參考。我不運行它。 [net-beta.net/ubench/](http://net-beta.net/ubench/)是各種基準的集合。如果你向下滾動到equal1 - equal7,你會發現比較測試。不幸的是,在整個頁面中沒有ID或錨定,所以我無法專門鏈接到一組測試。 – 2012-12-05 01:33:59