首頁 > 後端開發 > php教程 > php-弱型的小陷阱

php-弱型的小陷阱

WBOY
發布: 2016-08-08 09:31:38
原創
1164 人瀏覽過

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

問題起源是
var_dump(md5('240610708') == md5('QNKCDZO')); //true
兩個md5的字串,用比較運算子(==)比較出來居然是相等的。
輸出一下兩個的值分別是:
md5('240610708') //0e462097431906509019562988736854
md5('QNKCDZO')50385 3391

看到結果,第一眼感覺就是被intval了,所以0 == 0 回傳了true,
後來經過提醒,才發現並不是這樣。
php比較運算子:
http://php.net/manual/zh/language.operators.comparison.php
範例:

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 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
所以會出現相等的結果。

以上就介紹了php-弱型的小陷阱,包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板