問題
業(yè)務(wù)中有一個(gè)前輩高手寫的代碼赌渣,其中出現(xiàn)了這么一幕世落,不看答案淮腾,你知道結(jié)果是什么嗎?
<?php
function testIf($if){
if($if == "on" || $if == 1){
return true;
}
return false;
}
$if = 0;
var_dump(testIf($if));//運(yùn)行結(jié)果:true
為什么執(zhí)行結(jié)果是 true屉佳?谷朝??$if這個(gè)變量既不是["on"],也不是[1],怎么就能夠進(jìn)這個(gè)判斷里面去呢武花?圆凰??
測(cè)試
在判斷進(jìn)行到 [if($if == "on"...] 的時(shí)候体箕,他們其實(shí)是這樣執(zhí)行的
if($if == (int)"on" || $if == 1)
因?yàn)閜hp是弱類型語言专钉,所以在比較一個(gè)整型和一個(gè)字符串的時(shí)候,執(zhí)行時(shí)候會(huì)幫你強(qiáng)轉(zhuǎn)累铅,
字符串["on"]被強(qiáng)轉(zhuǎn)后就是[0]跃须,也就等于[$if]了,所以bug就來了娃兽。菇民。。我們的本意就是要判斷他們不相等從而跳出去的投储,所以要達(dá)到目的第练,應(yīng)該使用全等號(hào)。代碼應(yīng)該改為:
function testIf($if){
if($if === "on" || $if === 1){
return true;
}
return false;
}
建議
因?yàn)閜hp是弱類型語言玛荞,帶來方便的同時(shí)也容易出現(xiàn)各種各樣預(yù)料之外的問題娇掏,所以我們?cè)诰幋a上應(yīng)該避免這種類似的問題.