最近在Greg Beaver's的blog上發表的一篇新文章 comparing strings in PHP with the == operator 中提及了PHP的 == 運算子在對字串進行比較時值得注意的問題。
在某些情況下,PHP會把類別數值資料(如含有數字的字串等)轉換成數值處理,== 運算子就是其中之一。在使用== 運算子對兩個字串進行鬆散比較時,PHP會把類別數值的字串轉換為數值進行比較,下面的實驗證實了這個結論:
<span><span><code><span><span><br><span><?php</SPAN><BR><SPAN>var_dump</SPAN></SPAN><SPAN>(</SPAN><SPAN>'01' </SPAN><SPAN>== </SPAN><SPAN>1</SPAN><SPAN>);<BR></SPAN><SPAN><SPAN><SPAN>?></span><br></span></span>
var_dump('01 ' == 1);
?>
以上程式碼輸出結果為:bool(true) 所以,在使用對字串進行比較時,建議使用=== 運算子對字串進行嚴格的檢查,或使用strcmp()等函數,從而避免可能產生的問題。 PHP手冊中的《PHP 類型比較表》對此也有詳細說明。 <span><span><?php<BR>var_dump</SPAN><SPAN>(</SPAN><SPAN>in_array</SPAN><SPAN>(</SPAN><SPAN>'01'</SPAN><SPAN>, array(</SPAN><SPAN>'1'</SPAN><SPAN>)));<BR></SPAN><SPAN><SPAN>?></span><br></span>
除此之外,常用的in_array()函數也存在弱類型的問題,請參見如下代碼:<span><span><?php <BR>var_dump</span><span>(</span><span>in_array</span><span>(</span><span>'01'</span><span>, array(</span><span>'1'</span><span>)));<br></span><span><span>?></span></span></span>
CODE>以上程式碼輸出結果為:bool(true)
相信用過此函數進行安全性檢查的PHP程式設計人員都知道這會產生怎麼樣的安全問題了吧?幸好<span><span><?php <BR>var_dump</SPAN><SPAN>(</SPAN><SPAN>in_array</SPAN><SPAN>(</SPAN><SPAN>'01'</SPAN><SPAN>, array(</SPAN><SPAN>'1'</SPAN><SPAN>), </SPAN><SPAN>true</SPAN><SPAN>)); <BR></SPAN><SPAN><SPAN>?></span><br></span>
in_array()函數為我們提供了第三個參數,把它設為true 就可以打開
in_array()函數的強制類型檢查機制,如下程式碼所示:<span><span><?php <FONT face=Verdana size=2>var_dump</span><span>(</span><span>in_array</span><span>(</span>'01'</span><span>, array(</span><span>'1'</span><span>), </span><span>true</span><span>) ); </span><span><span>?></span><p></p></span>
bool(false)
由於PHP是一種弱型態的語言,也就是說資料型態這個概念在PHP中被弱化。因而如果在程式設計時過度忽略資料類型(也是大部份PHP程式設計師的通病),會產生一些問題,甚至導致安全漏洞。最後,還是那句說得很煩的話,對外來資料進行嚴格檢查和過濾。 以上就介紹了User-Agent字串 用PHP中的 == 運算子進行字串比較,包括了User-Agent字串方面的內容,希望對PHP教程有興趣的朋友有所幫助。