1. 程式人生 > >php-弱型別的小陷阱

php-弱型別的小陷阱

今天群裡討論的一個問題,記錄一下。

問題起源是
var_dump(md5('240610708') == md5('QNKCDZO')); //true

兩個md5的字串,用比較運算子(==)比較出來居然是相等的。

輸出一下兩個的值 分別是:
md5('240610708') //0e462097431906509019562988736854
md5('QNKCDZO')   //0e830400451993494058024219903391


看到結果,第一眼感覺就是被intval了,所以0 == 0 返回了true,
後來經過提醒,才發現並不是這樣。



示例:
如果比較一個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換為數值並且比較按照數值來進行。此規則也適用於 switch 語句。當用 === 或 !== 進行比較時則不進行型別轉換,因為此時型別和數值都要比對。
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}
?>

也就是說,這個相等不是因為兩個字串被intval了,變成0=0
而是被數值化 0e4xxx == 0e8xxx ,也就是科學計數法,0*10的n次方,也就是0.0000 和 0.00000000
所以會出現相等的結果。