PHP8中字串與數字的比較更智慧型

2021-10-19 21:45:45 字數 2147 閱讀 4136

php8.0發布[1]也有一段時間了,此次發布帶來了很多實用且強大的功能,比如:

named arguments

// php 7.x

htmlspecialchars($string, ent_compat | ent_html401, 'utf-8', false);

// php 8.0

htmlspecialchars($string, double_encode: false);

傳遞引數時,可以通過指定引數名傳遞。

constructor property promotion

// php 7.x

class point

}// php 8.0

class point

}

union types

// php 7.x

class number

}new number('nan'); // ok

// php 8.0

class number

}new number('nan'); // typeerror

當然,8.0中的feature不止這些,還有很多。這裡來詳細說一下saner string to number comparisons,就是本文的標題。

php中在比較時,我們經常這樣操作:

10 == '10'
結果符合我們的預期,但這樣並不是每次都正確,比如:

// php 7.x

0 == 'foobar' // true

// php 8.0

0 == 'foobar' // false

是不是很詭異?

再來乙個:

// php 7.x

var_dump(in_array(0, ['foo', 'bar'])); // true

// php 8.0

var_dump(in_array(0, ['foo', 'bar'])); // false

還有:

// php 7.x

$v = 0;

switch ($v)

// 輸出:

// baaar

// foo

// php 8.0

// 輸出

// foo

先來說一下php中的比較運算,分為兩類,嚴格型別(===,!==)和非嚴格型別(==,!=,>,>=, 兩者的主要區別如下:

在使用==比較數字字串時,php 8.0之前的版本會先將字串轉換為數字,之後再做兩個數字間的比較,這也就是為什麼上門0 == "foobar" = true了。

文章標題說php8中字串與數字的比較更智慧型,具體智慧型在**?針對上面的問題,8.0當中引入saner string to number comparisons這個特性[2],底層具體的操作為:當比較數字字元時,使用數字與數字對比,而其他字元與數字比較時,統一使用字串比較。我們來通過乙個**來對比下前後的變化:

comparison    | before | after

------------------------------

0 == "0" | true | true

0 == "0.0" | true | true

0 == "foo" | true | false

0 == "" | true | false

42 == " 42" | true | true

42 == "42foo" | true | false

參考:

PHP中的數字與字串比較

php中的比較運算子有點詭異,很容易出錯,現列出比較規則 1 當兩個字元進行大小比較時,是比較著這兩個字元的ascii碼大小 這條很容易理解。2 當兩個字串進行大小比較時,是從第乙個字元開始,分別比教對應的ascii大小,只要從從某個對應位置開始,其中乙個字串的當前位置字元大於另乙個字串對應位置字元...

PHP中的數字與字串比較

當兩個字元進行大小比較時,是比較著這兩個字元的ascii碼大小 這條很容易理解。當兩個字串進行大小比較時,是從第乙個字元開始,分別比教對應的ascii大小,只要從從某個對應位置開始,其中乙個字串的當前位置字元大於另乙個字串對應位置字元,即直接判別出這兩個字串大小,如 ba az 那麼 10 與 a ...

注意!PHP中字串與數字的比較

在日常開發過程中,運算子是我們每天都會接觸到的。這個運算子中其實埋了非常多的坑,今天我們就來看下字串和數字用 比較需要注意的問題。首先來看看這些 1echo 1234 1234 is 1234 1234 php eol 2echo 1234 n1234 is 1234 n1234 php eol 3...