徹底解決php判斷a==0為真引發的問題-類型轉換



一、起因

經常會遇到 字符串==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在整形范圍為整數,其他為浮點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM