程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php比較運算符的bug

php比較運算符的bug

編輯:關於PHP編程

疑問
首選,給出一個php的示例代碼,如果你完全明白為什麼會出現如下結果,就不需要再在這篇博客浪費時間了,這裡是讓php初學者注意一下可能會犯的錯誤


[php]
<?php 
 
var_dump("abcdefg" == "0");    // bool(false)  
var_dump("abdsafd" == 0);      // bool(true) 

<?php

var_dump("abcdefg" == "0");    // bool(false)
var_dump("abdsafd" == 0);      // bool(true)
如果你不是太清楚上面的結果,那就跟著博客繼續學習下去吧!


比較運算符
比較運算符,如同它們名稱所暗示的,允許對兩個值進行比較。


比較運算符 例子 名稱 結果
$a == $b 等於 TRUE,如果$a等於$b
$a === $b 全等 TRUE,如果$a等於$b,並且它們的類型也相同
$a != $b 不等 TRUE,如果$a不等於$b
$a <> $b 不等 TRUE,如果$a不等於$b
$a !== $b 非全等 TRUE,如果$a不等於$b,或者它們的類型不同
$a < $b 小於 TRUE,如果$a嚴格小於$b
$a > $b 大於 TRUE,如果$a嚴格大於$b
$a <= $b 小於等於 TRUE,如果$a小於或者等於$b
$a >= $b 大於等於 TRUE,如果$a大於或者等於$b

注意:
如果比較一個整數和字符串,則字符串會被轉換為整數
如果比較兩個數字字符串,則作為整數比較


講到這裡,就可以說一下上面那個php代碼了,var_dump("abcdefg" == "0")為false,是因為這是兩個字符串比較,對應於c的strcmp函數,因此應該為false。然而,var_dump("abdsafd" == 0)為true,則需要學習一下字符串轉換為整數的規則了

 


字符串轉換為整數
當一個字符串被用在了一個數字的環境中,結果和類型如下:


如果字符串沒有包含‘.’、'e'或'E',並且數字值符合整數類型的限定(PHP_INT_MAX定義的),這個字符串可被認定是一個integer,在其它情況下被認定為一個float


字符串的開始部分給定了它的值,如果字符串以合法的數字開始,這個數字就可直接使用。否則,值就是0.合法數值由符號,後面跟著一個或多個數字(可能有個小數點),再跟著可選的指數符號如'e'或'E',後面跟著一個或多個數字。


示例代碼:


[php]
<?php 
 
$foo = 1 + "10.5";                // $foo is float (11.5)  
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)  
$foo = 1 + "bob3";                // $foo is integer (1)  
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)  
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)  
$foo = "10.0 pigs " + 1;          // $foo is float (11)  
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)  
?> 

<?php

$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)
?>
這裡應該可以徹底解釋var_dump("abcdefg" == 0)為true了,因為比較運算符首先將“abcdefg”強制轉換為整數0,因為0==0為true了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved