前面我們跟大家分享了PHP可能會掉入的坑一,本文我們接著和大家分享PHP可能會遇到的坑二,希望能幫助大家。
在PHP的實際開發過程中遇到的一些坑,其中有部分是自己的理解不夠而造成的,坑到深處,真是淚流滿面啊。
關於整數與字串比較,這個問題修正過別人一次,最後不想自己也栽進來了,真是難堪,記下來,謹防再犯!
直接來看這個範例:
#
<?php $foo = 0; $bar = 'a3b4c5'; if ( $foo < $bar ) { echo 'output'; }
會不會有輸出呢,答案是不會,為什麼呢?因為數字跟字串比較時,字串會被轉換成數字,如果你呼叫轉換成整數的函數 intval( $bar ) ,會發現它的值就是0了,自然就不大於0了。如果$bar的值是'3a4b5c',那麼結果就會被輸出了,因為這時字串轉成數字的值是3了。具體的轉換規則,可以參考PHP Manual:
http://us2.php.net/manual/zh/language.types.string.php#language.types.string.conversion
#其實如果$foo被初始化成''的話,用兩個字串比較,也不會出錯了。
接上坑,再來看一個:
#
if ( $foo == 'a1b2c3' ) { echo 'output'; }
這次會不會被輸出呢?答案是會,原因其實跟上面的相同,'a1b2c3'在比較時被隱式類型轉換成了0。
如上問題解決方法無非是讓兩個數以相同的型別進行比較,而不用進行隱式型別轉換,這時全等號(===)就發揮作用了,因為三個等號不光會比較值,還會比較型別。另外在字串進行比較的時候,如果使用 strcmp() 函數,也不會有這個問題。
再來一例:
#
$checkedKeys = array('someKey1', 'someKey2'); $arrTest = array('someKey1' => 'someValue', 'otherValue'); foreach ($arrTest as $key => $value) { if (in_array($key, $checkedKeys)) { echo "The key valid: $key \n"; } }
類似的,這裡會有兩個輸出,第二次輸出的$key是0,理解了嗎?解決方法是在in_array()函數中加上第三個參數並設為true,進行嚴格的類型比較,文檔在這http://php.net/manual/zh/function.in-array.php
php這門語言的一大優點就是靈活,而這也為平時不認真謹慎而寫下的程式碼帶來了隱患。
相關推薦:
以上是PHP可能會遇到的坑二的詳細內容。更多資訊請關注PHP中文網其他相關文章!