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...