今天遇到一個問題,調用對方接口,按照接口說明,返回為數字0,1,2等等,其中0標示成功,其他表示不同的錯誤代碼,程序通過 if ($ret == 0) 進行判斷,開始程序是好的,今天出現問題了,由于對方接口修改,直接返回字母字符串作為錯誤信息提示,然后我這邊就悲劇了,上述判斷永遠都為TRUE.
原因在于php是弱類型語言,所以可以對兩個不同類型的變量進行比較操作,但最終進行比較前,php會把某一方轉換稱另一方一樣的類型,這點很重要,如果是字符串和數字進行比較,那么php會把字符串強制轉換稱數字,對于純字母的字符串,那么轉換后就是0了,所以if ($ret == 0) 成了.
PHP手冊/語言參考/運算符/比較運算符 可以找到.
在PHP里當兩個數字型字符串,只含數字的字符串,進行比較的時候是直接轉換成數值進行比較的,如下示例,注意$a和$b兩個變量的最后一位不相等,代碼如下:
- //示例1
- <?php
- $a = '511203199106034578';
- $b = '511203199106034579';
- if ($a==$b) {
- echo 'equal';
- } else {
- echo 'notEqual';
- }
- ?>
運行上面的程序卻發現結果為equal,非我們認為的結果,我們把$a與$b分別加一個字母a進去,代碼如下:
- //示例2
- <?php
- $a = 'a511203199106034578';
- $b = 'a511203199106034579';
- if ($a==$b) {
- echo 'equal';
- } else {
- echo 'notEqual';
- }
- ?>
這次輸出的是notEqual(正確的結果)
示例1為equal是因為PHP把兩個數字型字符串轉換成數字型,而這兩個數字剛好相等如下示例,代碼如下:
- <?php
- $a = 511203199106034578;
- $b = 511203199106034579;
- echo $a; // 輸出 5.1120319910603E+17 即511203199106030000
- echo $b; // 輸出 5.1120319910603E+17 即511203199106030000
- ?>
所以我們在示例1中得到的結果是equal,避免出現這種非預期結果的情況是使用類型比較符===如下示例(如果 $a 等于 $b,并且它們的類型也相同),代碼如下:
- //示例4
- <?php
- $a = '511203199106034578';
- $b = '511203199106034579';
- if ($a===$b) {
- echo 'equal';
- } else {
- echo 'notEqual';
- }
- ?>
這樣我們就可以得到預期中的notEqual了.
新聞熱點
疑難解答