var_dump(0) //int(0)
var_dump('0') //string(1) "0"
var_dump('ssddsd') //string(7) "sasadad"
var_dump(0=='sdfsdf') // bool(true)
var_dump('0'=='sdfsf') //bool(false)
在上面這些比較中為什麼var_dump(0=='sdfsdf') // bool(true)而var_dump('0'=='sdfsf') //bool(false)
我認為的是0是整形,和字元型'sdfsf'比較應該是false。。。。
為什麼實際結果卻是相反的,我哪裡理解錯了嗎???
回複內容:
var_dump(0) //int(0)
var_dump('0') //string(1) "0"
var_dump('ssddsd') //string(7) "sasadad"
var_dump(0=='sdfsdf') // bool(true)
var_dump('0'=='sdfsf') //bool(false)
在上面這些比較中為什麼var_dump(0=='sdfsdf') // bool(true)而var_dump('0'=='sdfsf') //bool(false)
我認為的是0是整形,和字元型'sdfsf'比較應該是false。。。。
為什麼實際結果卻是相反的,我哪裡理解錯了嗎???
var_dump(0=='sdfsdf')
當處理這句時,不同類型比較'sdfsdf'會被強制轉換成int型,也就是int 0,所以結果是true
var_dump('0'=='sdfsf')
當處理這句時,相同類型比較直接比較內容,內容不一樣,所以結果是false
你可以試試var_dump((int)("sdfsf"));結果是int 0
https://segmentfault.com/q/1010000000095573/a-1020000000098176
至於後面那個為啥錯誤的… 這個還需要說明麼… 判斷相等首要的因素是內容要相等,只是 ==
非strict 模式會幫我們自動將兩者的類型轉換成一致的而已。字串內容都不同你到底是為啥會覺得相等的…
你理解錯了。
比較子直接的轉換 是:整數和字串比較,字串轉為整數,那麼字串sdfsdf就轉為整數0了,所以第三條是true。
第四條是true因為他們都是字串,所以就直接比較了,那麼字串0和sdfsf自然不等,為false
==
比較只比較值,不同類型會轉換為同一類型比較。
要比較類型用===
,必須值和類型都一樣才為true。
這些官方文檔裡都有寫的,請仔細閱讀文檔。
var_dump(0=='sdfsdf');
弱類型比較通常會先進行類型轉換轉為相同類型在進行值相等判斷.
其中字串和數值的比較規則是字串轉換成數字. 所以上面那個比較實際的進行可看作
var_dump(0 == (int)'sdfsdf');
var_dump('0'=='sdfsf');
兩個都是字串就是比較值是否相等.
字串和數字關鍵後會被轉換成0,這樣的現象在資料庫中也會存在的
http://php.net/manual/zh/language.operators.comparison.php
如果比較一個數字和字串或者比較涉及到數字內容的字串,
則字串會被轉換為數值並且比較按照數值來進行.此規則也適用於switch語句.
當用===或!==進行比較時則不進行類型轉換,因為此時類型和數值都要比對.
PHP中字串跟數字比較時,字串會被轉化為數字後進行比較,轉化過程類似intval():
echo intval('5stars'); 輸出5print_r('5stars'==5); 輸出1var_dump('5stars'==5); 輸出bool(true)var_dump('5stars'===5); 輸出bool(false)var_dump('0e1'=='0e2'); 輸出bool(true)var_dump('0e1'==='0e2'); 輸出bool(false)
PHP中比較字串應該用恒等於===或者strcmp.