一、起因
經常會遇到 字符串==0 進行邏輯判斷時,判斷結果盡然為真。
例如下面的代碼盡然輸出了“字符串a盡然等於0”,剛開始會讓人大跌眼鏡。但知道了原因之后其實很簡單。這一切都是因為php是弱類型語言,當不同類型的值進行==比較的時候會發生類型轉換。
<?php if('a'==0){ echo "字符串a盡然等於0"; }
二、原因
php雖然是弱類型的語言,但它是有數據類型的。大概分為三種類型:字符串、數字、布爾型。上面的問題出現是由於字符串轉換為了數字類型。
正常情況下不同類型的值是不能比較的,php 為了比較進行了數據類型轉換。把不同類型的值轉換為相同類型后再比較。
規則如下:
寬松比較(==)類型轉換規則
(1)數字和字符串比較,將字符串轉為數字,然后進行比較
(2)數字和布爾型比較,將數字轉為布爾型,然后進行比較
(3)字符串和布爾型比較,將字符串轉為布爾型,然后進行比較。
寬松比較的落腳點只有兩個,一個是布爾型,一個是數字。只有當數字和字符串比較的時候,會把字符串轉為數字
三、字符串轉數字
1. 字符串的開始部分決定了它的數字值。
2. 如果該字符串以合法的數字值開始,則使用該數值。否則其值為 0(零)。
3. 合法數字值可以是正負號,后面跟着一個或多個數字(可能有小數點),再跟着可選的指數部分。指數部分由 'e' 或 'E' 后面跟着一個或多個數字構成。
四、剖析 'a'==0
'a' 這是一個字符串類型。0 是數字類型。使用 == 寬松比較,此時發生類型轉換。字符串和數字比較,是將字符串轉換為數字然后進行比較的。
運算步驟一:根據字符串轉數字的規則,字符串的開始部分決定了它的數字值。該字符串的開頭不是數字,則它的數字值為0。
所以'a' 轉換為數字類型時,它其實為0了。不僅'a'等於0,'abc','aabbcc' 它們轉為數字也是0哦。
運算步驟二:最后比較0是否等於0,結果為真。
五、更多示例
<?php //不帶數字的字符串 $a='a'; $b='b'; $c="cc"; var_dump((int)$a); //輸出int(0) var_dump((int)$b); //輸出int(0) var_dump((int)$c); //輸出int(0) //字符串開頭是數字 $a='1a'; $b='2b'; $c="100cc"; var_dump((int)$a); //輸出int(1) var_dump((int)$b); //輸出int(2) var_dump((int)$c); //輸出int(100) //字符串結尾是數字 $a='a1'; $b='b2'; $c="cc100"; var_dump((int)$a); //輸出 int(0) var_dump((int)$b); //輸出 int(0) var_dump((int)$c); //輸出 int(0) //字符串中間是數字 $a='a1a'; $b='b2b'; $c="cc100cc"; var_dump((int)$a); //輸出 int(0) var_dump((int)$b); //輸出 int(0) var_dump((int)$c); //輸出 int(0) //字符串開頭是浮點數 $a='1.1a'; $b='2.2b'; $c="100.1cc"; var_dump((float)$a); //輸出 double(1.1) var_dump((float)$b); //輸出 double(2.2) var_dump((float)$c); //輸出 double(100.1) //字符串開頭是小數點 $a='.1a'; $b='.2b'; $c=".1cc"; var_dump((float)$a); //輸出 double(0.1) var_dump((float)$b); //輸出 double(0.2) var_dump((float)$c); //輸出 double(0.1) //字符串開頭是科學計數法的浮點數 $a='1e1a'; $b='2E2b'; $c="3e3cc"; var_dump((float)$a); //輸出 double(10) var_dump((float)$b); //輸出 double(200) var_dump((float)$c); //輸出 double(3000) //字符串以0開頭,以十進制解析 $a='0a'; $b='01b'; $c="02cc"; var_dump((float)$a); //輸出 double(0) var_dump((float)$b); //輸出 double(1) var_dump((float)$c); //輸出 double(2)
運算:
$foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $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)
判別流程:1,看開頭是否有合法的數值,有則使用,無則為0。 2,合法的數值不含. e E在整形范圍為整數,其他為浮點。