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

php-弱型的小陷阱

WBOY
WBOY原創
2016-08-08 09:31:381179瀏覽

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

問題起源是
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教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn